使用小平面包裹设置单独的y轴限制,不使用刻度free_y

时间:2017-03-03 20:52:36

标签: r ggplot2

我有这个数据

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",因为我需要控制每个图表中的限制。

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

1 个答案:

答案 0 :(得分:11)

除非您想减少绘图区域(即不绘制某些点),否则在使用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))

但是,正如我所提到的,如果你想扩展你的极限,那么这种方法是有效的,而不是减少它们。 enter image description here