Как указала Камилла, у cowplot
есть действительно простой способ сделать это. Вы также можете сделать это, вручную расположив grobs
. Это особенно хорошо работает, если у вас есть графики с разной шириной, масштабами и разрывами. Один пример здесь.
Преимущество выполнения этого вручную, если только cowplot
не может, заключается в том, что вы можете указать, какие графики получают метки оси x, а также заголовки / метки оси y, поэтому в итоге вы можете иметь только заголовки оси x / надписи на ваших нижних сетках и заголовки / надписи по оси Y на ваших левых сетках. Недостатком является утомительное определение нескольких функций построения графиков, если у вас есть несколько графиков.
df_plots <- lapply(lst_df, function(x) {
ggplot() +
geom_point(data=lst_df[[i]], aes(x=lon, y=lat, size=sign, colour = cor), alpha = 0.5) +
scale_color_manual(values=c("blue", "orange"),
name='col',
labels = c('neg', 'pos'),
guide = guide_legend(override.aes = list(alpha = 1, size = 3))) +
scale_size(range = c(1,3),
breaks = c(90, 95, 99),
labels = c(1, 5, 10),
name = 'test',
guide = guide_legend(override.aes = list(colour = 'black',
alpha = 1)))
})
df_leg <- get_legend(df_plots[[1]]) # get legend
df_plots_noleg <- lapply(lst_df, function(x) { # make plots with no legends, however you want to do this
ggplot() +
geom_point(data=lst_df[[i]], aes(x=lon, y=lat, size=sign, colour = cor), alpha = 0.5) +
scale_color_manual(values=c("blue", "orange"),
name='col',
labels = c('neg', 'pos'),
guide = guide_legend(override.aes = list(alpha = 1, size = 3))) +
theme(legend.position = "none")
})
Если у вас есть графики, ширина которых начинает меняться, важно выровнять оси. Поскольку в этом примере они все одинаковые, это не имеет значения.
#maxWidth_df_plots <- grid::unit.pmax(df_plots_noleg1$widths[2:5], df_plots_noleg2$widths[2:5], df_plots_noleg3$widths[2:5], df_plots_noleg4$widths[2:5]) #get your grob widths
#df_plots_noleg1$widths[2:5] <- as.list(maxWidth1Page1)
#df_plots_noleg2$widths[2:5] <- as.list(maxWidth1Page1)
#df_plots_noleg3$widths[2:5] <- as.list(maxWidth1Page1)
#df_plots_noleg4$widths[2:5] <- as.list(maxWidth1Page1)
df_plots1 <- ggplotGrob(df_plots_noleg[[1]])
df_plots2 <- ggplotGrob(df_plots_noleg[[2]])
df_plots3 <- ggplotGrob(df_plots_noleg[[3]])
df_plots4 <- ggplotGrob(df_plots_noleg[[4]])
df_plot_arranged <- grid.arrange(arrangeGrob(df_plots1, df_plots2, df_plots3, df_plots4, nrow = 2),
arrangeGrob(nullGrob(), df_leg, nullGrob(), nrow = 1), ncol = 1, heights = c(4,0.5),
top = textGrob("Title Text Holder Here", gp = gpar(fotsize = 12, font = 2)))
![](https://i.stack.imgur.com/nxa3N.png)
Преимущество, которое я упомянул, заключается в том, что вы можете контролировать, какие графы получают, какую маркировку. Здесь вам поможет контроль ширины, как вы можете видеть на изображении, правые графики шире левых, а верхние выше, чем нижние.
df_plots1 <- df_plots_noleg[[1]] + theme(axis.title.x = element_blank(), axis.text.x = element_blank())
df_plots2 <- df_plots_noleg[[2]] + theme(axis.title.x = element_blank(), axis.title.y = element_blank(),
axis.text.x = element_blank(), axis.text.y = element_blank())
df_plots4 <- df_plots_noleg[[4]] + theme(axis.title.y = element_blank(), axis.text.y = element_blank())
df_plots1 <- ggplotGrob(df_plots1)
df_plots2 <- ggplotGrob(df_plots2)
df_plots3 <- ggplotGrob(df_plots_noleg[[3]])
df_plots4 <- ggplotGrob(df_plots4)
df_plot_arranged <- grid.arrange(arrangeGrob(df_plots1, df_plots2, df_plots3, df_plots4, nrow = 2),
arrangeGrob(nullGrob(), df_leg, nullGrob(), nrow = 1), ncol = 1, heights = c(4,0.5),
top = textGrob("Title Text Holder Here", gp = gpar(fotsize = 12, font = 2)))
![](https://i.stack.imgur.com/yp06L.png)