忽略拼凑中多个图的 x 标签对齐:这可能吗?

Leo*_*son 5 r alignment ggplot2 patchwork

我真的很喜欢 patchwork 包,多个图的对齐通常比其他包(cowplot/gridextra)更好、更容易实现。

然而,有一件事我无法解决:是否可以忽略拼凑物中的 x 轴对齐,而只对齐所有其他元素?或者手动调整拼凑后的x轴对齐方式?参见附图:如果可能的话,我希望补丁 B 和 C (Petal.Length) 的 x 轴标题更接近 x 轴。

在此输入图像描述

生成图像的代码:

library(ggplot2)
library(patchwork)

plot.1 <- ggplot(iris, aes(x = Species, y = Petal.Width)) +
  geom_boxplot() +
  scale_x_discrete(labels = c("A very\nvery\nlong\nlabel", "","")) +
  labs(x = element_blank())

plot.2 <- ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) +
  geom_point()

(plot.1 |plot.2)/(plot.2|plot.1) + 
  plot_annotation(tag_levels = "A")
Run Code Online (Sandbox Code Playgroud)

Pau*_*die 6

操作示例

library(ggplot2)
library(patchwork)

plot.1 <- ggplot(iris, aes(x = Species, y = Petal.Width)) +
  geom_boxplot() +
  scale_x_discrete(labels = c("A very\nvery\nlong\nlabel", "","")) +
  labs(x = element_blank())

plot.2 <- ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) +
  geom_point()

(plot.1 | plot.2) / 
  (plot.2 | plot.1) + 
  plot_annotation(tag_levels = "A")
Run Code Online (Sandbox Code Playgroud)

重新展示OP图

使用负边距

我花了一段时间才意识到这个问题源于需要对齐axis.texts 和axis.titles 的混合。尽管它们在语法上是不同的元素,但分类轴文本提供了连续轴标题的大部分或全部实用功能。标题将始终在对齐的文本区域之外进行网格对齐。仅靠理由并不能解决这个问题,但负边距可以。

笔记:

  • 您想要的负边距值取决于图中的其他比例因子,因此这是最后解决方案的改进之一。-50在这种情况下有效,但我需要使用其他值
  • 它也适用于 y 轴
  • 我用括号搞乱了,但除了额外的theme()层之外,绘图规范是相同的
  • 您通常不希望在单独的绘图定义中包含此负边距主题片段,因为它似乎会导致那里出现错误,并且您将无法以这种方式迭代地细化边距值,至少在您的脚本中不容易/Rmd 很长和/或很复杂。这实际上只是在用 组装图的级别上的问题patchwork,因此最好的做法是在定义拼凑组装时保持这样的抛光调整,如我在此处所示。
(plot.1 | (
  plot.2 +
    theme(axis.title.x = element_text(margin = margin(t = -50, unit = "pt"))))
) / (
  (plot.2 +
     theme(axis.title.x = element_text(margin = margin(t = -50, unit = "pt")))) | 
    plot.1
) + 
  plot_annotation(tag_levels = "A")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述