我注意到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
我想"放大"看看这些群体在IQR方面的比较情况,但后四分位数发生了变化:
p + scale_y_continuous(limits=c(0, 5))
请注意,每组的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的一些怪癖吗?或者我错过了一个错误?
答案 0 :(得分:3)
这是ggplot的一个怪癖,就像你说的那样。 scale_y_continuous
实际上会过滤掉y > 5
数据框的那些行。因此,您使用y < 5
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_cartesian
(http://ggplot2.tidyverse.org/reference/coord_cartesian.html)的ggplot文档解释了这一点:
笛卡尔坐标系是最常见的,也很常见的 坐标系的类型。设置坐标系的限制 将缩放情节(就像你用放大镜看它一样) 玻璃),并不会像设置限制那样改变基础数据 规模会。