将刻面ggplots(facet_wrap)与R中的cowplot对齐

Posted

技术标签:

【中文标题】将刻面ggplots(facet_wrap)与R中的cowplot对齐【英文标题】:Align facetted ggplots (facet_wrap) with cowplot in R 【发布时间】:2020-06-07 07:27:31 【问题描述】:

我正在尝试对齐两个面板图,通过以下方式在 ggplot 中生成 facet_wrap(注意:面板 A 需要保持空白):

然而,我注意到,面板 B 的 y 轴与面板 C 的最后一个图的 y 轴并不完全对齐(尽管在两个方面都有选项 axis = 'lb')。

代码

# Load libraries
library(tidyverse)
library(cowplot)

# Create two facetted plots 
p1 <- ggplot(data = diamonds, aes(x = carat, y = price)) +
  facet_wrap(~ cut, scales = "free_y", ncol = 5) +
  geom_point(size=0.5)

p2<- ggplot(data = filter(diamonds, price < 900 & (cut == "Fair" | cut == "Good" )), aes(x = carat, y = price)) +
  facet_wrap(~ cut, scales = "free_y", ncol = 2) +
  geom_point(size=0.5)

# Create panel A and panel B
a <- plot_grid(NULL, p2, labels = c("A", "B"), axis = 'lb', ncol = 2, rel_widths = c(3,2))

# Create a combined panel of 'a' and panel C
plot_grid(a, p1, labels = c("", "C"), axis = 'lb', ncol = 1, rel_heights = c(1,1))

首先,我认为它与 y 轴标签有关,但删除标签并不能解决问题。

问题

导致此行为的原因以及如何对齐使用facet_wrap 生成的图,使用cowplot 包。

期望的输出

我希望面板 B 的 y 轴与面板 C 中最后两个图的 y 轴垂直对齐(即,在红线处)

【问题讨论】:

对不起,这里的图片有点小,所以我之前很困惑。我不认为面板 A 是问题,但也许有更多经验的人知道得更好。我认为问题在于您的示例中 facet_wrap 的工作方式。因此,您创建了一个具有一定大小的图,一次包含 2 个图,另一次包含 5 个图。对我来说,由于这些 facet_wraps,您制作的图中的图表的间距/大小只是不同的。这不应该是无法解决的问题。 【参考方案1】:

就像我在 cmets 中所说的那样,我认为这与你的刻面间距有关,因为 2 vs 5 图 + Y 轴标签的差异。我可能是错的(这很可能),所以可能有一个更简单/更漂亮的解决方案。再说一次,这是一个建议,你可能会玩弄一下这些数字,但我认为这非常接近:

# Create two facetted plots 
p1 <- ggplot(data = diamonds, aes(x = carat, y = price)) +
  facet_wrap(~ cut, scales = "free_y", ncol = 5) +
  geom_point(size=0.5)

p2<- ggplot(data = filter(diamonds, price < 900 & (cut == "Fair" | cut == "Good" )), aes(x = carat, y = price)) +
  facet_wrap(~ cut, scales = "free_y", ncol = 2) +
  geom_point(size=0.5) +
  theme(panel.spacing = unit(1.15, "lines"),
        axis.title.y = element_text(margin = margin(t = 0, r = 5, b = 0, l = 0)))

# Create panel A and panel B
a <- plot_grid(NULL, p2, labels = c("A", "B"), axis = 'lb', ncol = 2, rel_widths = c(2.985,2.015))

# Create a combined panel of 'a' and panel C
plot_grid(a, p1, labels = c("", "C"), axis = 'lb', ncol = 1, rel_heights = c(1,1))

所以基本上我添加的是 p2 图表之间的更多间距,因为底部图中的数字比顶部图中的数字占用更多空间(毕竟还有 2 个额外的数字)。对我来说,修复了右侧两个图的对齐方式。我还增加了标签到轴的边距。这修复了左上图的对齐方式。我不确定是否需要更改标签和轴之间的距离。

【讨论】:

这是一个非常好的解决方案!我不认为你错了,我认为你很好地发现了问题。

以上是关于将刻面ggplots(facet_wrap)与R中的cowplot对齐的主要内容,如果未能解决你的问题,请参考以下文章

如何刻面 plot_ly() 图表?

如何刻面 plot_ly() 图表?

在 R 的 ggplot2 中一起使用 stat_function 和 facet_wrap

r 使用TeX Latex ggplot2进行刻面包装

在 R 中使用带有 facet_wrap 的 ggplot2 显示多个轴标签

R语言高维数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()姐妹花