ggplot按分组变量绘制直方图时比例计算错误的问题
解决ggplot分面直方图比例按组计算的问题
嘿,我完全懂你的困扰!你用facet_wrap(~group)生成了分面直方图,但比例却是按整个数据集算的,不是每个分组内部的占比——这确实是ggplot统计量计算时容易忽略的细节。
问题根源
原来的代码里,..count../sum(..count..)中的sum(..count..)会把所有分组的计数加总,而不是每个分面(group)单独计算总和,导致比例失真。
解决方案1:在ggplot中直接按组计算统计量
用after_stat()(ggplot2 3.3.0及以上版本推荐)配合group=group,告诉ggplot要按group变量分组计算统计量:
ggplot(data = d) + geom_histogram( aes(x = n, y = after_stat(count / sum(count)), group = group), binwidth = 1 ) + facet_wrap(~group)
这里的group=group是关键:它让每个分面内的sum(count)只计算当前组的总观测数,这样得到的就是每个组内部的比例了。
解决方案2:先预处理数据(更直观可控)
如果想更清晰地看到比例计算过程,避免ggplot内部统计量的“黑箱”,可以先用dplyr预处理数据,再用geom_col()绘制:
library(dplyr) # 先计算每个group内n的计数和比例 d_summary <- d %>% group_by(group, n) %>% tally(name = "count") %>% # 统计每组每个n的出现次数 mutate(prop = count / sum(count)) # 计算组内比例 # 绘制柱状图(因为已经是汇总数据,用geom_col更合适) ggplot(d_summary, aes(x = n, y = prop)) + geom_col(width = 1) + # width=1匹配原来的binwidth=1 facet_wrap(~group)
这种方法的好处是你可以先检查d_summary的数据,确认比例计算正确后再绘图,适合复杂的统计场景。
旧版本ggplot2兼容提示
如果你用的是ggplot2 3.3.0以下的版本,把after_stat()换成stat()即可,或者继续用..count../sum(..count..)语法,但同样要加上group=group参数。
内容的提问来源于stack exchange,提问作者StatsBoy
相关产品推荐
相关产品推荐

