是否可以创建具有共享 x 轴的重叠 y 轴?

Is it possible to create overlapping y-axes with a shared x-axis?

我经常有图形具有相同的共享 x 轴但不同的 y 轴。它们不能被分面,因为一些 y 轴需要复杂的名称 and/or 由于 historical/interpretational 原因翻转了坐标。

下面我画了一个这样的假记录的例子,并展示了我希望这个图在 Inkscape 中调整后的样子。有什么方法可以从 R/patchwork?

中实现这个结果
library(tidyverse)
library(patchwork)

set.seed(123)
dat <- tibble::tibble(a = 1:10,
                      b = c(0, 2, 5, 8, 5, 4, 6, 4, 3, 2),
                      c = -stats::rnorm(10, b, 3),
                      d = sample(letters[1:3], 10, TRUE))

shared_x <- c(0, 11)

pl1 <- dat %>%
  ggplot(aes(x = a, y = b)) +
  geom_point(colour = "indianred") +
  coord_cartesian(xlim = shared_x) +
  scale_y_continuous("B is awesome", position = "right")

pl2 <- dat %>%
  ggplot(aes(x = a, y = c)) +
  geom_point(colour = "steelblue") +
  scale_y_reverse("C is inversely related to B") +
  coord_cartesian(xlim = shared_x, ylim = c(3, -13))

theme_set(theme_classic())
(pl1 & theme(axis.title.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.line.x = element_blank())) / pl2

ggsave("overlapping_axes.pdf", width = 10, height = 8, units = "cm")

reprex package (v2.0.0)

于 2021-07-09 创建

这是手动调整的版本:

我看到 r2evans 已经给了你警告,每当有人认为辅助轴可以解决你的问题时,都应该考虑这些警告。我同意他们的看法,但这并不意味着它不能完成。

只要你能想到一个转换并且它是逆向的,你就可以用辅助轴来做这个(不要与 'you should do this' 混淆)。可以使用 ggh4x::axis_truncated() 复制轴的截断外观(免责声明,我是该函数的作者)。

在下面的示例中,第二个轴的变换 -x * 0.5 所以倒数是 - x / 0.5,但您可能可以更好地满足您的需求。

library(ggplot2)
library(ggh4x)

set.seed(123)
dat <- tibble::tibble(a = 1:10,
                      b = c(0, 2, 5, 8, 5, 4, 6, 4, 3, 2),
                      c = -stats::rnorm(10, b, 3),
                      d = sample(letters[1:3], 10, TRUE))

ggplot(dat, aes(a)) +
  geom_point(aes(y = b, colour = "b")) +
  geom_point(aes(y = -c * 0.5, colour = "c")) +
  scale_y_continuous(
    position = "right", breaks = seq(0, 8, by = 2),
    guide = guide_axis_truncated(),
    name = "B is awesome",
    sec.axis = sec_axis(
      trans = ~ -.x/0.5, breaks = c(0, -5, -10),
      guide = guide_axis_truncated(trunc_lower = -Inf),
      name = "C is inversely related to B"
    )
  ) +
  scale_colour_manual(values = c("indianred", "steelblue")) +
  theme_classic() +
  theme(
    axis.title.y.left = element_text(colour = "steelblue"),
    axis.title.y.right = element_text(colour = "indianred")
  )

reprex package (v1.0.0)

于 2021-07-09 创建

您可以通过设置适当的 hjusts 来更好地重新定位轴标题。