3

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")

图 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")

图 2

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

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

图 3

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

4

2 回答 2

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()

首先,我们可以计算这两个地块的实际高度,这篇文章解释了这个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

然后,使用拼凑而成这两个情节

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

在此处输入图像描述

于 2018-02-23T03:19:48.047 回答
1

这里的作者cowplot::plot_grid()。当您尝试将绘图与指定的纵横比对齐时,它不起作用,您在使用coord_equal(). 解决方案是使用 egg 库或 patchwork 库。Patchwork 仍在开发中,但应该很快就会发布到 CRAN。同时,您可以从 github 安装。

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

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)

在此处输入图像描述

于 2018-02-23T05:25:50.517 回答