R 使用刻面ggplot 2.0.0和;格里德雷特

R 使用刻面ggplot 2.0.0和;格里德雷特,r,ggplot2,gridextra,gtable,R,Ggplot2,Gridextra,Gtable,由于我已更新到ggplot2.0.0,因此无法使用gridExtra正确排列图表。问题是,刻面图表将被压缩,而其他图表将被扩展。宽度基本上弄乱了。我想将它们安排为类似于这些单面图的方式: 我放了一个可复制的代码 library(grid) # for unit.pmax() library(gridExtra) plot.iris <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point() + facet_gr

由于我已更新到ggplot2.0.0,因此无法使用gridExtra正确排列图表。问题是,刻面图表将被压缩,而其他图表将被扩展。宽度基本上弄乱了。我想将它们安排为类似于这些单面图的方式:

我放了一个可复制的代码

library(grid) # for unit.pmax()
library(gridExtra)

plot.iris <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + 
  geom_point() + 
  facet_grid(. ~ Species) + 
  stat_smooth(method = "lm")

plot.mpg <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl))) + 
  geom_point(size=2.5)

g.iris <- ggplotGrob(plot.iris) # convert to gtable
g.mpg <- ggplotGrob(plot.mpg) # convert to gtable

iris.widths <- g.iris$widths # extract the first three widths, 
mpg.widths <- g.mpg$widths # same for mpg plot
max.widths <- unit.pmax(iris.widths, mpg.widths)

g.iris$widths <- max.widths # assign max. widths to iris gtable
g.mpg$widths <- max.widths # assign max widths to mpg gtable

grid.arrange(g.iris,g.mpg,ncol=1)
library(grid)#用于unit.pmax()
图书馆(gridExtra)

plot.iris去掉这两条线,保留其余部分,效果很好

g.iris$widths <- max.widths # assign max. widths to iris gtable
g.mpg$widths <- max.widths # assign max widths to mpg gtable

g.iris$widths这很难看,但如果你在时间压力下,这种破解方法会奏效(不可推广,取决于绘图窗口大小)。基本上,在顶部绘制两列,右侧绘制空白图,并猜测宽度

grid.arrange(
    grid.arrange(plot.iris, ggplot() + theme_minimal(),ncol=2, widths = c(.9, .1)),
    plot.mpg, 
    ncol=1
)

我不确定您是否仍在寻找解决方案,但这是相当普遍的。我正在使用ggplot 2.1.0(现在在CRAN上)。这是基于。我把问题分成两部分。首先,我处理绘图的左侧,确保轴材质的宽度相同。其他人已经做到了这一点,而且还有解决办法。但我觉得结果不太好。我希望面板也在右侧对齐。因此,第二,该过程确保面板右侧的列的宽度相同。它通过在每个绘图的右侧添加一个适当宽度的列来实现这一点。(可能有更简洁的方法。有-见@baptiste solution。)

library(grid)#用于pmax
图书馆(gridExtra)#安排绘图
图书馆(ggplot2)#用于构建绘图
库(GTTable)#在没有图例的绘图的GTTable中添加列
mpg$g=“条带文本”
#四个相当不规则的情节:图例、刻面、条纹

p1一个选项是将每个绘图按摩到一个3x3 G表格中,中央单元格将所有绘图面板包裹起来

使用@SandyMuspratt中的示例

# devtools::install_github("baptiste/egg") 
grid.draw(egg::ggarrange(plots=plots, ncol=1))

其优点是,一旦采用这种标准化格式,无论面板、图例、轴、条带等的数量如何,绘图都可以更容易地组合成各种布局

grid.newpage()
grid.draw(ggarrange(plots=list(p1,  p4, p2, p3), widths = c(2,1), debug=TRUE))


感谢您的反馈,但这只是一个可复制的案例。我的实际情况要复杂得多,删除这些线会使图表无法正确对齐。事实上,如果我们删除这些线条,可再现性错误也不会生成对齐的图表。您希望实现什么?要将所有图表放在一行中吗?我的原始设置是一组4行1列的对齐图表(每行1个图表)。对于ggplot2 1.0.1,这是通过上面的代码完成的,但是对于ggplot2 2.0.0,会产生图表中显示的错误,您可以在我的第一篇文章中看到。@jordivid您的原始代码不应该与ggplot2 1.0.0版一起使用,我刚刚确认了它。原因是两个图的gtables具有不同的列数。可能是在选择前三列时它曾经起作用;那么它会在GGV2左右破裂。修复方法是从网格中应用unit.list函数。但是,它可能会在R的下一个版本中得到修复。但是刻面的压缩与此无关。在ggplot v1中仍然会发生这种情况。g.iris$宽度和g.iris$宽度是不同的长度,所以(我认为)您不能直接在它们之间应用unit.pmax。因此,只需尝试将其应用于面板左右部分的宽度<代码>最大宽度谢谢你的建议!我也尝试过将宽度细分,但也不起作用。代码的最后一部分我以前没有见过,但当我应用它时,我从grid.arrange(和grid.draw)
单位错误(宽度,默认值.units):(list)对象不能强制键入“double”
。我还尝试搜索gtable widths中的每个数字的含义,但我还没有获得该信息。对于上面的示例,它应该运行无误-对我来说是这样的(这是否是最好的方法是另一个问题;))。我替换了你的三行
max.widths,这很奇怪,因为在我提供的示例代码中,它抛出了错误。。。明天我将在另一台机器上进行测试,看看它是否会有所不同。这将是一个版本的东西。。我对网格不够熟悉,所以不知道。。但是fwiw。。Rv3.2.3、gridExtra v2.1.0、ggplot2 v2.0.0我一直在想,为什么不管是否有图例,ggplot并不总是保留一个空白。顺便说一句,图例并不总是在右边,如果你的目标是完全的通用性,这可能会成为一场噩梦。将每个情节拆分为三个独立的GTTable,分别对应于以下组:左、面板、右,并将这三个单独对齐如何?实际上,我已经尝试过这个想法,但它似乎并没有让任何事情变得更容易,事实上恰恰相反。我发布了一个修改后的解决方案。更一般一点。它不像原始解决方案那样查找图例。取而代之的是确保图中面板右侧的空间宽度相同。3x3的想法可以发挥作用(参见鸡蛋包装),但将左轴右转有点麻烦,证明你的鸡蛋包装是一块宝石!将每个元素对齐是非常棒的。刻面图和未刻面图根据绘图区域对齐。轴标签可以有不同的长度!让我的一天和更多的肯定来。谢谢!这是一个很棒的解决方案!我想知道是否有可能控制
egg
中不同的单独绘图有多大?例如,plot1是组合图大小的1/2,而plot2到4位于其余一半。谢谢(假设您正在讨论最后一个示例,2x2布局)这就是宽度的作用(应该做的);IIRC中存在一个bug,因此在某些情况下,您可能必须手动编辑生成的gtable宽度/高度
grid.newpage()
grid.draw(ggarrange(plots=list(p1,  p4, p2, p3), widths = c(2,1), debug=TRUE))