facet_wrap 每个面板的轴相等

facet_wrap equal axis per panel

我想使用 facet_wrap 绘制一个图,其中每个面板的轴可以不同,但​​在面板内 xy 轴应该是相同的比例。

例如看下面的图

df <- read.table(text = "
x y g
1 5 a
2 6 a
3 7 a
4 8 a
5 9 b
6 10 b
7 11 b
8 12 b", header = TRUE)

library(ggplot2)

ggplot(df, aes(x=x,y=y,g=g)) +
  geom_point() +
  facet_wrap(~ g) # all axes 1-12

ggplot(df, aes(x=x,y=y,g=g)) +
  geom_point() +
  facet_wrap(~ g, scales = "free")
 # fee axes, y & y axes don't match per panel

我想要的是面板 a 的 x 轴以及为什么面板 b 的 x 轴和 y 轴都在 5 - 12 范围内。

这可能吗?

使用 this 答案您可以尝试以下操作:

dummy <- data.frame(x = c(1, 8, 5, 12), y = c(1, 8, 5, 12), g = c("a", "a", "b", "b"))
ggplot(df, aes(x=x,y=y)) +
 geom_point() +
 facet_wrap(~ g, scales = "free") + 
 geom_blank(data = dummy)

另一种解决方案是通过在 x 和 y 反转的情况下向绘图添加不可见点,从而使绘制的数据为 "square",例如,

library(ggplot2)
p <- ggplot(data = df) + 
       geom_point(mapping = aes(x = x, y = y)) + 
       geom_point(mapping = aes(x = y, y = x), alpha = 0) + 
       facet_wrap( ~ g, scales = "free")
print(p)

您也可以使用 geom_blank()。您不需要虚拟数据。

当问题被问到时,这不是一个选项,但这些天我强烈建议 patchwork 用于组合图。