ika*_*sky 18 r ggplot2 cowplot
我正试图通过使用cowplot包来以出版物的方式安排绘图.
我只是希望面板的尺寸和尺寸相同.
library(ggplot2)
library(cowplot)
gg1 <- ggplot(mtcars)+
geom_point(aes(x=mpg,y=hp))+
theme_bw()+
theme(aspect.ratio=1)
gg2 <- ggplot(mtcars)+
geom_point(aes(x=mpg,y=hp,fill=cyl))+
facet_wrap(~cyl,ncol=2)+
theme_bw()+
theme(aspect.ratio=1,
legend.position='none')
output <- plot_grid(gg1,gg2, labels = c('A','B'),label_size = 20)
print(output)
Run Code Online (Sandbox Code Playgroud)
如您所见,水平轴既不匹配,也不匹配面板的上边缘.
这个论点align从cowplot不方位图工作.
有任何想法吗?
由于这是关于牛皮图和复杂对齐的最高投票问题之一,我想指出牛皮图现在确实具有一些用于对齐刻面图的功能.(我是包的作者.)但是,它们在这种特殊情况下不起作用!
例如,这可以工作(使用axis选项plot_grid()):
gg1 <- ggplot(mtcars) +
geom_point(aes(x=mpg, y=hp)) +
theme_bw()
gg2 <- ggplot(mtcars)+
geom_point(aes(x=mpg, y=hp, fill=cyl)) +
facet_wrap(~cyl, ncol=2) +
theme_bw() +
theme(legend.position='none')
plot_grid(gg1, gg2, labels = c('A','B'), label_size = 20,
align = 'h', axis = 'tb')
Run Code Online (Sandbox Code Playgroud)
我们也可以执行以下操作,以获得不同类型的对齐方式(取决于您是否希望将小平面条作为绘图的一部分计算):
plot_grid(gg1, gg2, labels = c('A', 'B'), label_size = 20,
align = 'h', axis = 'b')
Run Code Online (Sandbox Code Playgroud)
为什么我说这不适用于这种情况?因为,如果您查看问题中的原始代码,您会看到theme(aspect.ratio=1)我删除了一个设置.只要您不强制使用特定的宽高比,牛仔图就可以对齐绘图,因为它用于对齐绘图的方法通常会修改各个绘图的宽高比.
这是一个黑客,直到有人提出一个更优雅的答案:你可以grid.arrange从gridExtra包中使用来改变两个图的相对大小,以便轴排成一行.w下面代码中的参数是通过给左侧绘图提供更多的水平宽度来控制它,从而使其与右侧绘图相比更大.
library(gridExtra)
w = 0.512
grid.arrange(gg1, gg2, widths=c(w,1-w), ncol=2)
Run Code Online (Sandbox Code Playgroud)
您还可以使用arrangeGrob和textGrob为每个图添加"A"和"B"标题.
w = 0.512
grid.arrange(arrangeGrob(textGrob("A", x=0.13, gp=gpar(fontface="bold", cex=1.4)),
gg1, heights=c(0.03,0.97)),
arrangeGrob(textGrob("B", x=0.13, gp=gpar(fontface="bold", cex=1.4)),
gg2, heights=c(0.03,0.97)),
widths=c(w,1-w), ncol=2)
Run Code Online (Sandbox Code Playgroud)
在任何一种情况下,你都需要w手动调整以使图表排成一行(这就是使这种方法成为次优的原因).适当的值w将根据绘图的物理大小而变化.w=0.512当我将下面的图保存png为1000 x 500像素时,似乎运行良好.
一个更好的答案可能涉及类似于这个SO答案的东西,但适用于排列刻面和非刻面图(或者更一般地说,它们的构成凹凸之间没有一对一对应的图).