如何为不同的facet设置不同的尺度限制?

问题描述 投票:0回答:2

一些示例数据:

dfr <- data.frame(
  x = rep.int(1:10, 2),
  y = runif(20),
  g = factor(rep(letters[1:2], each = 10))
)

具有两个方面的简单散点图:

p <- ggplot(dfr, aes(x, y)) + 
  geom_point() +
  facet_wrap(~ g, scales = "free_y")

我可以使用

设置所有面板的轴限制
p + scale_y_continuous(limits = c(0.2, 0.8))

(或者像

ylim
这样的包装)

但是如何为不同的面设置不同的轴限制?

格子式的方法是将一个列表传递给这个参数,例如,

p + scale_y_continuous(limits = list(c(0.2, 0.8), c(0, 0.5)))

不幸的是,这只会在 ggplot2 情况下引发错误。

编辑:

这是部分破解。如果您想扩展比例范围,则可以向数据集中添加指定限制的列,然后使用

geom_blank
绘制它们。

修改后的数据集:

dfr <- data.frame(
  x = rep.int(1:10, 2),
  y = runif(20),
  g = factor(rep(letters[1:2], each = 10)),
  ymin = rep(c(-0.6, 0.3), each = 10),
  ymax = rep(c(1.8, 0.5), each = 10)
)

更新剧情:

p + geom_blank(aes(y = ymin)) + geom_blank(aes(y = ymax))

现在刻度不同了,左手的刻度是正确的。不幸的是,右手刻度不会收缩,因为它需要为点腾出空间。

如果有帮助,我们现在可以将问题改写为“是否可以在不重新计算比例且不显式调用

scale_y_continuous
的情况下绘制点?”

r ggplot2
2个回答
0
投票

要缩小左侧图的比例,请删除范围之外的点。例如。这会将右图上的 y 比例减小到 0 到 0.5 之间的值:

p <- ggplot(dfr, aes(x, y)) +   
     geom_point(subset=.(g == "a" | (y > 0 & y <.5))) +
     geom_blank(aes(y = ymin)) + geom_blank(aes(y = ymax)) +
     facet_wrap(~ g, scales = "free_y")

另请参阅我对此问题的回答


0
投票

{gggh4x} 包有一个简洁的函数可以做到这一点:

p <- ggplot(dfr, aes(x, y)) + 
  geom_point() +
  facet_wrap(~ g, scales = "free_y") + 
  ggh4x::facetted_pos_scales(
    y = list(
      scale_y_continuous(limits=c(0.2, 0.8)),
      scale_y_continuous(limits=c(0, 0.5))
    )
  )
© www.soinside.com 2019 - 2024. All rights reserved.