设置单独的Y轴限制free_y

设置单独的Y轴限制free_y

问题描述:

我有这样的数据设置单独的Y轴限制free_y

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方面的限制吗?

+0

您可以使用'gridExtra'软件包和单个绘图。 – mtoto

+0

那不是我正在寻找的 – user3022875

+0

如果您想为每个图表设置个人y限制,有什么区别。 – mtoto

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

+0

非常聪明的解决方案,很好地解释。但是这也可以“放大”吗? – Uwe

+0

不幸的是没有。 'geom_blank()'可以用来增加限制,但不能减小。现在不能想到类似的解决方案来减少(“放大”)。也许有条件去除阴谋的那些“离群值”。因此,如果你想仅在2和4之间绘制y。但是你的数据从1到10.在绘图之前放置一个条件来删除低于2或大于4的任何东西4。 – Jav