我正在使用ggplot,并且有两个我想要在彼此上面显示的图形。我使用了gridExtra中的grid.arrange
来堆叠它们。问题是,我希望图形的左边缘与右边缘对齐,而不考虑轴标签。(问题出现是因为一个图的标签很短,而另一个图的标签很长)。
问题:
我该怎么做呢?我没有和grid.arrange结婚,但是ggplot2是必须的。
我尝试过的东西:
我试着使用宽度和高度以及ncol和nrow来制作一个2 x 2的网格,并将视觉效果放置在对角,然后再使用宽度,但我无法在对角获得视觉效果。
require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip()
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip()
grid.arrange(A, B, ncol=1)
发布于 2012-11-09 03:00:15
尝尝这个,
gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
maxWidth = grid::unit.pmax(gA$widths[2:5], gB$widths[2:5])
gA$widths[2:5] <- as.list(maxWidth)
gB$widths[2:5] <- as.list(maxWidth)
grid.arrange(gA, gB, ncol=1)
编辑
这里有一个更通用的解决方案(适用于任意数量的图),它使用gridExtra
中包含的rbind.gtable
的修改版本
gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
grid::grid.newpage()
grid::grid.draw(rbind(gA, gB))
发布于 2013-10-11 22:50:58
我想将其推广到任意数量的图中。以下是使用Baptiste的方法的分步解决方案:
plots <- list(A, B, C, D)
grobs <- list()
widths <- list()
收集每个图的每个grob的宽度
for (i in 1:length(plots)){
grobs[[i]] <- ggplotGrob(plots[[i]])
widths[[i]] <- grobs[[i]]$widths[2:5]
}
使用do.call获取最大宽度
maxwidth <- do.call(grid::unit.pmax, widths)
指定每个grob的最大宽度
for (i in 1:length(grobs)){
grobs[[i]]$widths[2:5] <- as.list(maxwidth)
}
绘图
do.call("grid.arrange", c(grobs, ncol = 1))
发布于 2015-10-01 15:45:02
使用cowplot包:
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip()
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip()
library(cowplot)
plot_grid(A, B, ncol=1, align="v")
https://stackoverflow.com/questions/13294952
复制相似问题