使用coord_equal()时使用cowplot :: plot_grid()垂直对齐不同高度的图

时间:2018-02-22 09:48:55

标签: r ggplot2 gtable cowplot

我正在尝试使用cowplot::plot_grid()组合两个ggplot对象并垂直对齐它们。使用align = "v"通常很简单。

dat1 <- data.frame(x = rep(1:10, 2), y = 1:20)
dat2 <- data.frame(x = 1:10, y = 1:10)
plot1 <- ggplot(dat1, aes(x = x, y = y)) + geom_point()
plot2 <- ggplot(dat2, aes(x = x, y = y)) + geom_point()
cowplot::plot_grid(plot1, plot2, ncol = 1, align = "v")

image 1

但是,当ggplots使用coord_equal()时,此方法失败,因为plot_grid()在强制宽高比时无法修改轴。相反,默认是保持每个图的高度相同。

plot1 <- ggplot(dat1, aes(x = x, y = y)) + geom_point() + coord_equal()
plot2 <- ggplot(dat2, aes(x = x, y = y)) + geom_point() + coord_equal()
cowplot::plot_grid(plot1, plot2, ncol = 1, align = "v")

image 2

我可以通过玩rel_heights论证来强制实现我的目标,但这不是一个可行的解决方案,因为我有许多动态情节要构建。这里,y轴是对齐的,所有轴的坐标仍然相等。

cowplot::plot_grid(plot1, plot2, ncol = 1, align = "v", rel_heights = c(2, 1.07))

image 3

我已经看到许多使用ggplot2::ggplotGrob()grid::grid_draw()的类似问题的方法,但在使用coord_equal()时,没有任何问题可以解决这个问题。也许最好的解决方案根本不使用cowplot::plot_grid(),或者解决方案可能以某种方式动态确定并将正确的值传递给rel_heights。我想我更喜欢后面的选项,以便能够轻松使用cowplot::plot_grid()附带的其他功能。也许在this related approach中可以找到一些有用的灵感。

2 个答案:

答案 0 :(得分:1)

默认情况下,轴的范围实际上会延伸超过 ggplot 中的限制。函数expand中的scale_continuous/discrete()参数用于设置扩展。与scale_continuous()文档中一样:

  

长度为2的数字向量,给出乘法和加法扩展   常量。这些常量确保数据放置在离轴一定距离的位置。连续变量的默认值为c(0.05,0),离散变量的默认值为c(0,0.6)。

library(ggplot2)
dat1 <- data.frame(x = rep(1:10, 2), y = 1:20)
dat2 <- data.frame(x = 1:10, y = 1:10)
plot1 <- ggplot(dat1, aes(x = x, y = y)) + geom_point() + coord_equal()
plot2 <- ggplot(dat2, aes(x = x, y = y)) + geom_point() + coord_equal()

拳头,我们可以计算这两个图的实际高度,this post解释了expand参数的工作原理。

# The defaults are c(0.05, 0) for your continuous variables
limity1 <- max(dat1$y) - min(dat1$y)
y1 <- limity1 + 2 * limity1 * 0.05
limity2 <- max(dat2$y) - min(dat2$y)
y2 <- limity2 + 2 * limity2 * 0.05

然后,使用patchwork撰写这两个图

library(patchwork)
#  actual heights of plots was used to set the heights argment
plot1 + plot2 + plot_layout(ncol = 1, heights = c(y1, y2))

enter image description here

答案 1 :(得分:1)

此处Assert.IsTrue( a = b ) // The type 'TestType' does not support the 'equality' constraint because blah-blah-blah 的作者。当您尝试对齐使用cowplot::plot_grid()时生成的指定宽高比的绘图时,它不起作用。解决方案是使用蛋库或拼凑库。拼凑仍在开发中,但很快就会发布到CRAN。同时,您可以从github安装。

这是使用鸡蛋的解决方案。在我看来它运作得很好。

coord_equal()

enter image description here

我看到的两个小问题是:(1)两个y轴的轴刻度不同,这使得它看起来像是间距不同,(2)轴被扩展到不同的极限。您可以通过手动设置刻度和扩展来解决这两个问题。

library(ggplot2)
library(egg)

dat1 <- data.frame(x = rep(1:10, 2), y = 1:20)
dat2 <- data.frame(x = 1:10, y = 1:10)
plot1 <- ggplot(dat1, aes(x = x, y = y)) + geom_point() + coord_equal()
plot2 <- ggplot(dat2, aes(x = x, y = y)) + geom_point() + coord_equal()
ggarrange(plot1, plot2, ncol = 1)

enter image description here