当scale_y_continuous更改时,ggplot更改错误栏位置

时间:2018-01-30 18:13:10

标签: r ggplot2 errorbar

我注意到ggplot中的一个奇怪的行为(除非我有一些错误,我没有看到):

set.seed(111)
d = data.frame(x = factor(sample(1:3, size=1000, replace=T)), y = rnorm(1000, 1, .5)^4)
p = ggplot(data=d, aes(x=x, y=y)) +
    geom_jitter(alpha=.15, width=.05, size=.75) +
    stat_summary(fun.y='median', geom='point', size=2, color='red') +
    stat_summary(aes(x=x, y=y), geom='errorbar', fun.ymin=function(z) {quantile(z, .25)}, fun.ymax = function(z) {quantile(z, .75)}, fun.y=median, color='red', width=.2)
p

enter image description here

我想"放大"看看这些群体在IQR方面的比较情况,但后四分位数发生了变化:

p + scale_y_continuous(limits=c(0, 5))

enter image description here

请注意,每组的75百分位数大约是2,但是当我计算实际百分位数时,我得到的值接近3:

>aggregate(y~x, data=d, FUN=quantile, .75)
  x        y
1 1 3.140711
2 2 2.868939
3 3 2.842267

这是ggplot的一些怪癖吗?或者我错过了一个错误?

1 个答案:

答案 0 :(得分:3)

这是ggplot的一个怪癖,就像你说的那样。 scale_y_continuous实际上会过滤掉y > 5数据框的那些行。因此,您使用y < 5

获得该子集的第75个百分位数
aggregate(y~x, data=subset(d, y<5), FUN=quantile, .75)
  x        y
1 1 2.075563
2 2 1.709106
3 3 2.059628

要获取所需的放大图,请使用coord_cartesian代替scale_y_continuous。特别是这应该有效:

 p + coord_cartesian(ylim = c(0, 5))

coord_cartesianhttp://ggplot2.tidyverse.org/reference/coord_cartesian.html)的ggplot文档解释了这一点:

  

笛卡尔坐标系是最常见的,也很常见的   坐标系的类型。设置坐标系的限制   将缩放情节(就像你用放大镜看它一样)   玻璃),并不会像设置限制那样改变基础数据   规模会。