如何在牛皮画中将普通的ggplot与刻面的ggplot对齐?

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)

代码生成此图. 在此输入图像描述

如您所见,水平轴既不匹配,也不匹配面板的上边缘.

这个论点aligncowplot不方位图工作.

有任何想法吗?

Cla*_*lke 7

由于这是关于牛皮图和复杂对齐的最高投票问题之一,我想指出牛皮图现在确实具有一些用于对齐刻面图的功能.(我是包的作者.)但是,它们在这种特殊情况下不起作用!

例如,这可以工作(使用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)我删除了一个设置.只要您不强制使用特定的宽高比,牛仔图就可以对齐绘图,因为它用于对齐绘图的方法通常会修改各个绘图的宽高比.


eip*_*i10 5

这是一个黑客,直到有人提出一个更优雅的答案:你可以grid.arrangegridExtra包中使用来改变两个图的相对大小,以便轴排成一行.w下面代码中的参数是通过给左侧绘图提供更多的水平宽度来控制它,从而使其与右侧绘图相比更大.

library(gridExtra)

w = 0.512

grid.arrange(gg1, gg2, widths=c(w,1-w), ncol=2)
Run Code Online (Sandbox Code Playgroud)

您还可以使用arrangeGrobtextGrob为每个图添加"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答案的东西,但适用于排列刻面和非刻面图(或者更一般地说,它们的构成凹凸之间没有一对一对应的图).