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
相关产品推荐
相关产品推荐

