使用facet wrap设置单独的y轴限制,而不是使用scales free_y。

21

我有这些数据

library(ggplot2)

dat = data.frame(x = c(1,2,1,2), 
                 group = c("a","a","b","b"), 
                 y = c(10,20,1000,2000))

ggplot(dat, aes(x = x, y = y)) + 
    geom_point() + 
    geom_line() + 
    facet_wrap(~group, ncol = 1) +
    coord_cartesian(ylim = c(0, 30))

由于我将y轴限制设置为0,30,所以B组未显示。我想手动设置每个图表的y轴限制。我不想使用scales = "free_y",因为我需要对每个图表的限制进行控制。

是否有办法实现这一点?您是否可以在facet wrap中为每个图表提供y轴限制?


你可以使用 gridExtra 包和单独的绘图来实现。 - mtoto
2
这不是我要找的。 - user3022875
似乎官方并不支持:https://github.com/tidyverse/ggplot2/issues/187 - MrFlick
这将是更多的工作。如果你有50个,100个图表怎么办…… - user3022875
2
请随意实现并发送拉取请求。 - Roman Luštrik
显示剩余5条评论
1个回答

39

除非你希望减少绘图区域(即不绘制某些点),否则在使用 scales = "free_y" 的同时,仍然可以对 y 轴限制进行 "完全" 控制。

您可以使用我给出的相同技巧来回答您的其他问题:如何设置圆角分面包装 y 轴的限制?

dat <- data.table(dat)

dat[,y_min := y*0.5, by = group]
dat[,y_max:= y*1.5, by = group]

ggplot(dat, aes(x = x, y = y)) + 
  geom_point() + 
  geom_line() + 
  facet_wrap(~group, ncol = 1, scales = "free_y") +
  geom_blank(aes(y = y_min)) +
  geom_blank(aes(y = y_max))

对于其他阅读此问题的人,诀窍在于为每个组显式创建y_miny_max变量。然后通过geom_blank()绘制它们。(实际上没有绘制任何内容,但是每个facet的绘图区域根据该组的y_miny_max值进行调整)。

如果出于某些原因,您希望手动提供最小值和最大值(而不是使用规则),则没有任何限制。但这很繁琐:

dat[group == "a",y_min := 0]
dat[group == "a",y_max := 30]
dat[group == "b",y_min := 0]
dat[group == "b",y_max := 3000]

ggplot(dat, aes(x = x, y = y)) + 
  geom_point() + 
  geom_line() + 
  facet_wrap(~group, ncol = 1, scales = "free_y") +
  geom_blank(aes(y = y_min)) +
  geom_blank(aes(y = y_max))

但是,正如我所提到的,这只适用于想要扩展自己极限的人,而不是减少它们。

enter image description here

1
非常聪明的解决方案,解释得很好。但这也适用于“放大”吗? - Uwe
2
很遗憾,geom_blank() 可以用于增加限制,但不能用于减少限制。目前无法想到类似的缩小(“放大”)解决方案。也许可以设置条件来删除那些绘图中的“离群值”。因此,如果您只想在 2 和 4 之间绘制 y 值,但您的数据范围是从 1 到 10,请在绘图之前设置条件,删除低于 2 或高于 4 的任何内容。 - Jav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接