ggplot2-将奇数个图正确排列到一个图中

时间:2018-10-23 16:12:56

标签: r ggplot2 cowplot

我有一个奇数个图可以排列成一个图形,我希望显示最后一个图形居中于图形的最后一行。

这里有一些示例数据:

Uncaught SyntaxError: Invalid or unexpected token     menu-wc.js:34

我想将第3个图放在图的中心。 我正在使用library(ggplot2) set.seed(99) x_1 = data.frame(z = rnorm(100)) x_2 = data.frame(z = rnorm(100)) x_3 = data.frame(z = rnorm(100)) lst = list(x_1, x_2, x_3) lst_p = list() for (i in 1:length(lst)) { lst_p[[i]] = ggplot(data=lst[[i]], aes(lst[[i]]$z)) + geom_histogram() + xlab("X LAB") + ylab("Y LAB") } p_no_labels = lapply(lst_p, function(x) x + xlab("") + ylab("")) title = cowplot::ggdraw() + cowplot::draw_label("test", size = 20) p_grid = cowplot::plot_grid(plotlist = p_no_labels, ncol = 2) print(cowplot::plot_grid(title, p_grid, ncol = 1, rel_heights = c(0.05, 1, 0.05)))

有什么建议吗? 谢谢

enter image description here

4 个答案:

答案 0 :(得分:4)

使用嵌套的cowplot::plot_grid

library(ggplot2)
set.seed(99)

x_1 = data.frame(z = rnorm(100))
x_2 = data.frame(z = rnorm(100))
x_3 = data.frame(z = rnorm(100))

lst = list(x_1, x_2, x_3)

lst_p = list()

for (i in 1:length(lst)) {
    lst_p[[i]] = ggplot(data=lst[[i]], aes(lst[[i]]$z)) + 
    geom_histogram() +
        xlab("X LAB") +
        ylab("Y LAB") 
}


p_no_labels = lapply(lst_p, function(x) x + xlab("") + ylab(""))

title = cowplot::ggdraw() + cowplot::draw_label("test", size = 20)
top_row = cowplot::plot_grid(p_no_labels[[1]], p_no_labels[[2]], ncol=2)
bottom_row = cowplot::plot_grid(NULL, p_no_labels[[2]], NULL, ncol=3, rel_widths=c(0.25,0.5,0.25))

cowplot::plot_grid(title, top_row, bottom_row, ncol=1, rel_heights=c(0.1,1,1))

答案 1 :(得分:3)

您可以为此使用gridExtra::grid.arrange。您所需要做的就是使用布局矩阵指定图的布局。

library(ggplot2)
set.seed(99)

x_1 = data.frame(z = rnorm(100))
x_2 = data.frame(z = rnorm(100))
x_3 = data.frame(z = rnorm(100))

lst = list(x_1, x_2, x_3)

lst_p = list()

for (i in 1:length(lst)) {
lst_p[[i]] = ggplot(data=lst[[i]], aes(lst[[i]]$z)) + 
geom_histogram() +
xlab("X LAB") +
ylab("Y LAB") 
}

p_no_labels = lapply(lst_p, function(x) x + xlab("") + ylab(""))


#layout of plots

lay <- rbind(c(1,2),c(1,2),
              c(3,3))



#arrange the grid and specify the `layout_matrix`
gridExtra::grid.arrange(grobs=p_no_labels, layout_matrix=lay)

enter image description here

答案 2 :(得分:3)

这使用gridgridExtra将图放置在2×4矩阵布局上。您的每个地块都占用两个“地块”。最下面一行的两个外部“插槽”被绘制为NULL grob,以使您的绘图居中。

# Convert to grobs
lst_p <- lapply(lst_p, ggplotGrob)

# Plot using gridExtra and grid
gridExtra::grid.arrange(lst_p[[1]], lst_p[[2]], grid::nullGrob(), lst_p[[3]], grid::nullGrob(),
                        layout_matrix = matrix(c(1,1,2,2,3,4,4,5), byrow = TRUE, ncol = 4))

enter image description here

答案 3 :(得分:1)

一个不那么优雅的解决方案是在第一行中将中间图留空:

p_no_labels2<-list(p_no_labels[[1]],NULL,p_no_labels[[2]],NULL,p_no_labels[[3]])
p_grid = cowplot::plot_grid(plotlist = p_no_labels2, ncol = 3) 

enter image description here