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

ggplot直方图添加均值中位数图例及调整Y轴计数刻度问题咨询

完整可运行代码

library(ggplot2)

# 测试数据生成
studyData=data.frame(X=rchisq(1:100000, df=3))
colnames(studyData) <- "hoursstudying"

# 汇总均值、中位数到同一数据框,方便映射图例
stats <- data.frame(
  指标 = c("均值", "中位数"),
  值 = c(mean(studyData$hoursstudying), median(studyData$hoursstudying))
)

p <- ggplot(studyData, aes(x = hoursstudying)) +
  # 直方图y轴直接使用计数
  geom_histogram(aes(y = after_stat(count)), binwidth = 1, colour = "black", fill = "lightblue") +
  # 可选:如果需要在柱体顶部标注计数值,取消注释下面一行即可
  # geom_text(aes(y = after_stat(count), label = after_stat(count)), stat = "bin", binwidth = 1, vjust = -0.3, size = 2.5) +
  # 对密度曲线做同比例缩放,适配计数刻度Y轴
  geom_density(aes(y = after_stat(density * nrow(studyData) * 1)), alpha=.2, fill="#FF6666") +
  # 垂直线的颜色、线型映射到统计指标,自动生成对应图例
  geom_vline(data = stats, aes(xintercept = 值, color = 指标, linetype = 指标), size = 1) +
  # 手动匹配你原本设定的垂直线样式
  scale_color_manual(values = c("均值" = "red", "中位数" = "purple")) +
  scale_linetype_manual(values = c("均值" = "dashed", "中位数" = "solid")) +
  labs(title = "Hours Spent Completing Course Work",
       y = "Count",
       x = "Hours Studying",
       # 合并两个图例的名称
       color = "统计量",
       linetype = "统计量") +
  theme(plot.title = element_text(hjust = 0.5))

p

核心修改说明

  • 垂直线添加图例:不再分开定义均值、中位数两个独立数据框,汇总为同一个长表后,在geom_vline的美学映射中绑定颜色、线型和统计指标类别,ggplot会自动生成对应图例,无需手动构造图例元素。
  • Y轴改为计数刻度保留密度曲线:利用计数与密度的换算关系计数 = 密度值 * 总样本量 * 柱宽,对密度曲线的Y值做等比例缩放,即可让密度曲线和计数刻度的Y轴完美匹配,不需要新增第二Y轴,可读性更强。
  • 修复了原代码中theme行前缺少连接符+的语法错误,以及Y轴标签和实际数值不匹配的问题。

内容的提问来源于stack exchange,提问作者Sven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:57:04