如何设置直方图X轴范围包含0值并绘制含高亮0值的直方图与正态分布
解决方案:带高亮0值和正态曲线的直方图
我经常用ggplot2处理这类可视化需求,它的灵活性刚好能满足你高亮特定值、添加分布曲线的要求。下面是完整的实现步骤和代码:
步骤1:准备数据与加载依赖包
首先把你的数据整理成数据框,同时新增一个分组列来标记0值和非0值,方便后续高亮区分:
# 加载ggplot2包 library(ggplot2) # 你的原始数据(补全了末尾省略的部分值,不影响逻辑) values <- c(25.222222, 6.000000, 2.057143, 0.000000, 2.142857, 0.000000, 73.666667, 4.081081, 43.133333, 18.937500, 60.822222, 23.379310, 54.954412, 8.492308, 67.646250, 15.885000, 38.585859, 46.810606, 31.565152, 39.813889, 40.620000, 25.958000, 54.821429, 9.000000, 33.040476, 50.329670, 43.525641, 33.508696, 34.265385, 57.003544, 36.690434, 48.074074, 70.372222, 77.602564, 29.997) # 转换为数据框并添加分组标记 df <- data.frame(value = values) df$group <- ifelse(df$value == 0, "Zero Value", "Non-Zero")
步骤2:绘制直方图与正态曲线
接下来绘制直方图,高亮0值,同时添加拟合的正态分布曲线,并确保X轴范围包含0:
ggplot(df, aes(x = value, fill = group)) + # 绘制直方图,设置透明度避免重叠,binwidth可根据数据调整 geom_histogram(aes(y = ..density..), binwidth = 5, alpha = 0.7, color = "black") + # 添加拟合数据分布的正态曲线(用数据自身的均值和标准差) stat_function(fun = dnorm, args = list(mean = mean(df$value), sd = sd(df$value)), color = "red", size = 1) + # 强制X轴从0开始,上限设为数据最大值+5,保证0值完全显示 scale_x_continuous(limits = c(0, max(df$value) + 5)) + # 自定义填充色,让0值更醒目 scale_fill_manual(values = c("Zero Value" = "#ff6b6b", "Non-Zero" = "#4ecdc4")) + # 添加标题与标签 labs(title = "Histogram with Highlighted Zero Values and Normal Curve", x = "Value", y = "Density", fill = "Group") + # 使用简洁的主题 theme_minimal()
优化:突出少量的0值
如果你的数据中0值数量极少(比如只有2个),直方图的0值柱子可能会很窄,这时候可以额外添加一条垂直虚线来强化标记:
ggplot(df, aes(x = value, fill = group)) + geom_histogram(aes(y = ..density..), binwidth = 5, alpha = 0.7, color = "black") + stat_function(fun = dnorm, args = list(mean = mean(df$value), sd = sd(df$value)), color = "red", size = 1) + # 添加0值位置的垂直虚线 geom_vline(xintercept = 0, color = "darkred", linetype = "dashed", size = 1.2) + scale_x_continuous(limits = c(0, max(df$value) + 5)) + scale_fill_manual(values = c("Zero Value" = "#ff6b6b", "Non-Zero" = "#4ecdc4")) + labs(title = "Histogram with Highlighted Zero Values and Normal Curve", x = "Value", y = "Density", fill = "Group") + theme_minimal()
内容的提问来源于stack exchange,提问作者karla
相关产品推荐
相关产品推荐

