我正在尝试使用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")
但是,当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")
我可以通过玩rel_heights
论证来强制实现我的目标,但这不是一个可行的解决方案,因为我有许多动态情节要构建。这里,y轴是对齐的,所有轴的坐标仍然相等。
cowplot::plot_grid(plot1, plot2, ncol = 1, align = "v", rel_heights = c(2, 1.07))
我已经看到许多使用ggplot2::ggplotGrob()
和grid::grid_draw()
的类似问题的方法,但在使用coord_equal()
时,没有任何问题可以解决这个问题。也许最好的解决方案根本不使用cowplot::plot_grid()
,或者解决方案可能以某种方式动态确定并将正确的值传递给rel_heights
。我想我更喜欢后面的选项,以便能够轻松使用cowplot::plot_grid()
附带的其他功能。也许在this related approach中可以找到一些有用的灵感。
答案 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))
答案 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()
我看到的两个小问题是:(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)