首页 > 解决方案 > 在R中的cowplot包中对齐2行中的垂直3个图

问题描述

我想从第 1 行对齐垂直绘图并从第 2 行绘图。不管我多么努力,但它并没有让我对齐。

在此处输入图像描述

有任何想法吗?


library(dplyr)
library(forcats)
library(ggplot2)
library(cowplot)

city_mpg <- mpg %>%
  mutate(class = fct_lump(class, 4, other_level = "other")) %>%
  group_by(class) %>%
  summarize(
    mean_mpg = mean(cty),
    count = n()
  ) %>% mutate(
    class = fct_reorder(class, count)
  )

p1 <- ggplot(city_mpg, aes(class, count)) + 
  geom_col() + 
  ylim(0, 65) + 
  coord_flip()

p2 <- ggplot(city_mpg, aes(mean_mpg, count)) + 
  geom_point()

p3 <- ggplot(mtcars, aes(wt, mpg)) +
  geom_point()

first <- plot_grid(p1, p2, align = 'h', axis = 'l',rel_widths = c(2,1))
second <- plot_grid(p3)
plot_grid(first, second,ncol = 1, align = 'v', axis = 'l',rel_heights = c(2,1))

标签: rggplot2cowplot

解决方案


这里的术语ggplot对齐得很好 - 它是不对齐的面板。“面板”表示 x 和 y 轴之间的区域,“绘图”被认为是面板占据的整个区域 + 轴刻度、轴文本和轴标题。

为什么这很重要?好吧,plot_grid()对齐所有地块,但不对齐面板。由于p1y 轴文本比 的 y 轴文本更长p3,因此面板左侧的区域p1也更宽。与 的左侧对齐时p1p3表示 的面板在p3的左侧p1

解决这个问题的简单方法是在p3. 通过使用theme(plot.margin),我们可以在 的左侧增加一些空间,p3使 in 的面板左侧的区域与 in 的p3区域大致相似p1。不幸的是,除了反复试验之外,以任何其他方式做到这一点都不是很简单。您必须添加一些边距并再次绘制以查看它是太多还是太少。最后,结果虽然有效。同样,我在右侧添加了一些边距,p3以使该面板的右侧部分与面板的右侧对齐p2

要修复,p3现在的代码如下所示:

p3 <- ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  theme(plot.margin = margin(l=44, t=0, b=0, r=6, 'pt'))

在此处输入图像描述


推荐阅读