gpt4 book ai didi

r - ggplot2 Boxplot 显示与计算不同的中位数

转载 作者:行者123 更新时间:2023-12-05 01:36:10 32 4
gpt4 key购买 nike

我正在根据大数据(2150000 个案例)按年份绘制两组体重的简单箱线图。除去年的最后一组外,所有组的中位数都相同,但在箱线图上,它绘制得好像与其他组一样。

 #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")

最佳答案

此行为的原因与 ylim() 的操作方式有关。 ylim()scale_y_continuous(limits=... 的便利函数/包装器。如果您 look into the documentation 对于 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= 则不会。

关于r - ggplot2 Boxplot 显示与计算不同的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62281957/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com