You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题原因

  1. 废弃参数触发异常逻辑:fun.y是ggplot2旧版本的参数,现已被废弃,改用fun=mean或fun.data。旧参数可能导致分组计算逻辑混乱。
  2. 分组规则未明确:stat_summary默认仅按x(净度)分组计算均值,不会自动把fill=cut作为分组依据。即便指定了填充颜色,ggplot也会把同一净度下的所有切工数据混算成一个均值,再随机匹配一个切工的颜色(刚好显示为Ideal)。
  3. 未设置柱状图位置:即便分组正确,默认的堆叠式柱状图会把同净度的多个切工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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 01:27:39