ggplot2箱线图显示的中位数与计算结果不同

3

我正在基于大数据(215万个案例)绘制两组体重按年份的简单箱线图。 除了最后一年的最后一组之外,所有组的中位数都相同,但在箱线图上,它被画成与其他所有组相同。

 #boxplot
ggplot(dataset, aes(x=Year, y=SUM_MME_mg, fill=GenderPerson)) + 
  geom_boxplot(outlier.shape = NA)+
  ylim(0,850)


#median by group
pivot <- dataset %>%
  select(SUM_MME_mg,GenderPerson,Year )%>%
  group_by(Year, GenderPerson) %>%
  summarise(MedianValues = median(SUM_MME_mg,na.rm=TRUE))

我搞不清楚在盒须图计算或中位数函数中哪些数据更准确,也不知道自己哪里做错了。R 没有报错或警告。

 #my data:
> dput(head(dataset[,c(1,7,10)]))
structure(list(GenderPerson = c(2L, 1L, 2L, 2L, 2L, 2L), Year = c("2015", 
"2014", "2013", "2012", "2011", "2015"), SUM_MME_mg = c(416.16, 
131.76, 790.56, 878.4, 878.4, 878.4)), row.names = c(NA, 6L), class = "data.frame")
1个回答

6
这种行为的原因与 ylim() 的操作方式有关。 ylim()scale_y_continuous(limits=... 的便利函数/包装器。如果您查看 scale_continuous 函数的文档(链接),您会发现设置限制不仅会缩放到一个区域,而且实际上还会删除该区域之外的所有数据点。这是在计算/统计函数之前发生的,所以使用 ylim() 时中位数会有所不同。您在 ggplot() 之外进行的计算涉及整个数据集,而使用 ylim() 意味着在进行计算之前将删除数据点。

幸运的是,这有一个简单的解决方法,就是使用 coord_cartesian(ylim=...) 替换 ylim(),因为 coord_cartesian() 只会缩放数据而不会删除数据点。请看这里的区别:

ggplot(dataset, aes(x=Year, y=SUM_MME_mg, fill=GenderPerson)) + 
  geom_boxplot(outlier.shape = NA) + ylim(0,850)

enter image description here

ggplot(dataset, aes(x=Year, y=SUM_MME_mg, fill=GenderPerson)) + 
  geom_boxplot(outlier.shape = NA) + coord_cartesian(ylim=c(0,850))

enter image description here

这种行为的提示也应该明显,因为第一个使用 ylim() 的代码块也应该会给出警告信息:
Warning message:
Removed 3 rows containing non-finite values (stat_boxplot). 

第二种方法使用coord_cartesian(ylim=不起作用。

谢谢,那真的帮了很多。 - Vesna
谢谢!在我的情况下,这个问题也很难追踪。 - cnluzon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接