【问题标题】:Setting individual y axis limits with facet wrap NOT with scales free_y使用 facet wrap 设置单个 y 轴限制而不是使用 scale free_y
【发布时间】:2017-03-03 20:52:36
【问题描述】:

我有这个数据

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))

你可以看到 B 组没有出现,因为我将 y 限制设置为 0,30。我想为每个图表手动设置单独的 y 限制。我不想使用scales = "free_y",因为我需要控制每个图表中的限制。

有没有办法做到这一点?你能以某种方式为分面包装中的每个图表提供 y 限制吗?

【问题讨论】:

  • 您可以使用gridExtra 打包和单独的地块。
  • 这不是我要找的
  • 如果您想为每个图表设置单独的 y 限制,有什么区别。
  • 官方好像不支持:github.com/tidyverse/ggplot2/issues/187
  • 随意实现它并发送拉取请求。

标签: r ggplot2


【解决方案1】:

除非您想减小绘图区域(即不绘制某些点),否则您仍然可以在使用 scales = "free_y" 时“完全”控制您的 y 限制。

您可以使用我给出的相同技巧来回答您的其他问题:how to set limits on rounded facet wrap y axis?

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()“绘制”它们。 (实际上没有绘制任何内容,但每个构面的绘制区域会根据该组的 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))

但是,正如我所提到的,如果您想扩大限制,而不是减少限制,这很有效。

【讨论】:

  • 非常聪明的解决方案,很好解释。但这是否也适用于“放大”?
  • 很遗憾没有。 geom_blank() 可用于增加限制但不能减少。现在想不出类似的减少(“放大”)的解决方案。也许设置一个条件来删除那些用于绘图的“异常值”。因此,如果您只想在 2 和 4 之间绘制 y。但是您的数据从 1 变为 10。在绘图之前添加一个条件以删除低于 2 或高于 4 的任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多