ggplot中stat_summary统计异常:I1净度仅显示Ideal切工均价
ggplot统计均值时I1净度仅显示Ideal切工的原因
问题复现
运行以下代码绘制频数柱状图,能看到I1净度包含Fair、Premium、Ideal等所有切工类型:
library(tidyverse) ggplot(diamonds, aes(x = clarity, fill = cut)) + geom_bar()
但运行以下统计均值的代码时,仅I1净度的Ideal切工有数值显示:
ggplot(diamonds, aes(x=clarity, y=price, fill=cut)) + stat_summary(fun.y="mean", geom="bar")
问题原因
- 废弃参数触发异常逻辑:
fun.y是ggplot2旧版本的参数,现已被废弃,改用fun=mean或fun.data。旧参数可能导致分组计算逻辑混乱。 - 分组规则未明确:
stat_summary默认仅按x(净度)分组计算均值,不会自动把fill=cut作为分组依据。即便指定了填充颜色,ggplot也会把同一净度下的所有切工数据混算成一个均值,再随机匹配一个切工的颜色(刚好显示为Ideal)。 - 未设置柱状图位置:即便分组正确,默认的堆叠式柱状图会把同净度的多个切工bar叠在一起,若未设置
position="dodge",也会看起来只有一个bar显示。
修正方案
方案1:修正stat_summary参数与分组
ggplot(diamonds, aes(x=clarity, y=price, fill=cut, group=cut)) + stat_summary(fun=mean, geom="bar", position="dodge")
- 添加
group=cut明确按切工分组计算均值 - 用新版参数
fun=mean替代废弃的fun.y - 设置
position="dodge"让同净度的不同切工bar并排显示
方案2:提前计算均值(更推荐)
先通过dplyr计算各组均值,再用geom_col绘制,逻辑更清晰:
diamonds %>% group_by(clarity, cut) %>% summarise(mean_price = mean(price), .groups = "drop") %>% ggplot(aes(x=clarity, y=mean_price, fill=cut)) + geom_col(position="dodge")
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

