Добавить отметки о фасетных графиках в R

Я хочу добавить отметки о фасетных графиках. Например, для такого фасетного сюжета:

require(ggplot2)

p <- ggplot(mpg, aes(displ, hwy)) + 
     geom_point() + 
     theme_minimal() +
     geom_hline(yintercept=10, linetype="solid") +
     geom_vline(xintercept=1.0, linetype="solid") +
     scale_x_continuous(limits=c(1,8), expand =c(0,0), 
     breaks = rep(2:7)) +
     scale_y_continuous(limits = c(10, 50), expand = c(0,0), 
     breaks = c(20,30,40)) +
     facet_wrap(~cyl) +   
     theme(panel.margin.x=unit(1.2, "lines"),
     panel.margin.y=unit(1.2, "lines"))
p

введите описание изображения здесь

Я хочу добавить метки, чтобы это выглядело так (обратите внимание, что, хотя метки добавляются ко всем фасетам, метки меток отображаются только на левом и нижнем фасетах):

введите описание изображения здесь

Я пробовал использовать функцию annotation_custom, чтобы добавить линии к оси. Однако мои попытки не работают.

require(gridExtra)
require(grid)   
x.breaks = rep(2:7)
y.breaks = c(20,30,40)

for (i in 1:length(x.breaks))   {
  p = p + annotation_custom(grob = linesGrob(y = unit(c(0, 5), "npc"),
                       gp=gpar(col= "black")),  
                       xmin = x.breaks[i], 
                       xmax = x.breaks[i], 
                       ymin = 8.69, 
                       ymax = 8.89)
  }

for (i in 1:length(y.breaks))   {
  p = p + annotation_custom(grob = linesGrob(x = unit(c(0, 5), "npc"),
                       gp=gpar(col= "black")),  
                       xmin = 0.769,
                       xmax = 0.809,                           
                       ymin = y.breaks[i], 
                       ymax = y.breaks[i])
  }

gt = ggplotGrob(p)
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)

Есть ли у кого-нибудь предложения? Заранее спасибо.


person R. Joe    schedule 17.08.2016    source источник
comment
Вы можете получить справку из документа ggplot2   -  person krishna Prasad    schedule 17.08.2016


Ответы (2)


Вот низкоуровневый способ убрать числа,

p <- ggplot(mpg, aes(displ, hwy)) + 
  geom_point() + 
  theme_bw() +
  geom_hline(yintercept=10, linetype="solid") +
  geom_vline(xintercept=1.0, linetype="solid") +
  scale_x_continuous(limits=c(1,8), expand =c(0,0), 
                     breaks = rep(2:7)) +
  scale_y_continuous(limits = c(10, 50), expand = c(0,0), 
                     breaks = c(20,30,40)) +
  facet_wrap(~cyl, scales="free") 

g <- ggplotGrob(p)
g$grobs$axis_b1$children[[2]][["grobs"]][[2]] <- nullGrob()
g$grobs$axis_b2$children[[2]][["grobs"]][[2]] <- nullGrob()
grid.newpage()
grid.draw(g)

введите описание изображения здесь

можно также удалить соответствующее пространство в таблице gtable.

person baptiste    schedule 17.08.2016
comment
Спасибо @baptiste. Ваш ответ помог. Далее добавляю: g$grobs$axis_l2$children[[2]][["grobs"]][[1]] <- nullGrob() и g$grobs$axis_l4$children[[2]][["grobs"]][[1]] <- nullGrob() Воспроизведен нужный мне сюжет. Если в будущей версии ggplot2 можно будет сделать доступными аргументы в функции facet_wrap() для настройки меток фасетов и меток меток фасетов, возможно, этот тип вопросов будет легче решить. - person R. Joe; 17.08.2016

Вот решение, использующее функцию grid.arrange и пакет grid:

введите описание изображения здесь

p_top = ggplot(subset(mpg, cyl %in% c(4,5)), aes(displ, hwy)) + 
     geom_point() + 
     theme_minimal() +
     geom_hline(yintercept=10, linetype="solid") +
     geom_vline(xintercept=1.0, linetype="solid") +
     scale_x_continuous(limits=c(1,8), expand =c(0,0), 
     breaks = rep(2:7)) +
     scale_y_continuous(limits = c(10, 50), expand = c(0,0), 
     breaks = c(20,30,40)) +
     facet_wrap(~cyl, ncol = 2) +
     theme(axis.ticks.x = element_line(), axis.text.x = element_blank()) + 
     labs(x=NULL, y = NULL)

p_bot = ggplot(subset(mpg, cyl %in% c(6,8)), aes(displ, hwy)) + 
     geom_point() + 
     theme_minimal() +
     geom_hline(yintercept=10, linetype="solid") +
     geom_vline(xintercept=1.0, linetype="solid") +
     scale_x_continuous(limits=c(1,8), expand =c(0,0), 
     breaks = rep(2:7)) +
     scale_y_continuous(limits = c(10, 50), expand = c(0,0), 
     breaks = c(20,30,40)) +
     facet_wrap(~cyl, ncol = 2) +
     theme(axis.ticks.x = element_line()) + 
     labs(y = NULL)

library(grid)
grid.arrange(p_top, p_bot, left = textGrob("hwy", rot = 90, vjust = 1))
person bVa    schedule 17.08.2016