使用 coord_equal() 时使用 cowplot::plot_grid() 垂直对齐不同高度的图
Vertically align of plots of different heights using cowplot::plot_grid() when using coord_equal()
我正在尝试使用 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
参数来强制我的 objective,但这不是一个可行的解决方案,因为我有许多动态图要构建。这里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.
中找到一些有用的灵感
默认情况下,坐标轴的范围实际上超出了 ggplot 中的限制。函数 scale_continuous/discrete()
中的 expand
参数用于设置扩展。如 scale_continuous()
文档中所述:
A numeric vector of length two giving multiplicative and additive expansion
constants. These constants ensure that the data is placed some distance away from the axes. The defaults are c(0.05, 0) for continuous variables, and c(0, 0.6) for discrete variables.
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()
首先,我们可以计算出这两个地块的实际高度,解释了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))
cowplot::plot_grid()
的作者在这里。当您尝试将绘图与指定的纵横比对齐时,它不起作用,这是您在使用 coord_equal()
时生成的。解决方案是使用 egg 库或 patchwork 库。 Patchwork 仍在开发中,但应该很快就会发布到 CRAN。同时,您可以从 github.
安装
这是一个使用 egg 的解决方案。在我看来,它工作得很好。
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)
我看到的两个小问题是 (1) 两个 y 轴的轴刻度不同,这使得间距看起来不同,以及 (2) 轴扩展到不同的限制。您可以通过手动设置刻度和扩展来解决这两个问题。
plot1 <- ggplot(dat1, aes(x = x, y = y)) + geom_point() +
scale_y_continuous(limits = c(0, 21), breaks = 5*(0:4), expand = c(0, 0)) +
coord_equal()
plot2 <- ggplot(dat2, aes(x = x, y = y)) + geom_point() +
scale_y_continuous(limits = c(0, 11), breaks = 5*(0:4), expand = c(0, 0)) +
coord_equal()
ggarrange(plot1, plot2, ncol = 1)
我正在尝试使用 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
参数来强制我的 objective,但这不是一个可行的解决方案,因为我有许多动态图要构建。这里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.
默认情况下,坐标轴的范围实际上超出了 ggplot 中的限制。函数 scale_continuous/discrete()
中的 expand
参数用于设置扩展。如 scale_continuous()
文档中所述:
A numeric vector of length two giving multiplicative and additive expansion constants. These constants ensure that the data is placed some distance away from the axes. The defaults are c(0.05, 0) for continuous variables, and c(0, 0.6) for discrete variables.
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()
首先,我们可以计算出这两个地块的实际高度,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))
cowplot::plot_grid()
的作者在这里。当您尝试将绘图与指定的纵横比对齐时,它不起作用,这是您在使用 coord_equal()
时生成的。解决方案是使用 egg 库或 patchwork 库。 Patchwork 仍在开发中,但应该很快就会发布到 CRAN。同时,您可以从 github.
这是一个使用 egg 的解决方案。在我看来,它工作得很好。
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)
我看到的两个小问题是 (1) 两个 y 轴的轴刻度不同,这使得间距看起来不同,以及 (2) 轴扩展到不同的限制。您可以通过手动设置刻度和扩展来解决这两个问题。
plot1 <- ggplot(dat1, aes(x = x, y = y)) + geom_point() +
scale_y_continuous(limits = c(0, 21), breaks = 5*(0:4), expand = c(0, 0)) +
coord_equal()
plot2 <- ggplot(dat2, aes(x = x, y = y)) + geom_point() +
scale_y_continuous(limits = c(0, 11), breaks = 5*(0:4), expand = c(0, 0)) +
coord_equal()
ggarrange(plot1, plot2, ncol = 1)