基于BMI分类的直方图区间设置及轴标签修正问题求助
问题描述
需要根据BMI分类标准创建直方图,要求:
- 按指定区间分组并对应上色:
- 严重偏瘦(<16.0)→红色
- 中度偏瘦(16.0–16.9)→橙色
- 轻度偏瘦(17.0–18.4)→粉色
- 正常范围(18.5–24.9)→绿色
- 超重(25.0–29.9)→蓝色
- 肥胖I级(30.0–34.9)→粉色
- 肥胖II级(35.0–39.9)→橙色
- 肥胖III级(≥40.0)→红色
- 现有R代码生成的直方图y轴显示密度而非频率,x轴组距区间显示错误,需调整。
原代码:
Height <- c(1.72, 1.86, 2.1, 1.7, 1.6, 1.67, 1.59, 1.88, 1.7, 1.72, 1.9, 1.88, 1.59, 1.55, 1.91, 1.61, 1.82, 1.66, 1.77, 1.74) Weight <- c(77, 79, 102, 70, 63, 62, 55, 89, 88, 88, 128, 100, 55, 60, 79, 59, 57, 70, 72, 74) BMI <- Weight/Height^2 class_range <- c(16, 16.9, 18.4, 24.9, 29.9, 34.9, 39.9) hist(BMI, freq=TRUE, main="", breaks=class_range, col=c("red", "orange", "pink", "green", "blue", "pink", "orange", "red"))
当前生成的直方图:
修正方案
问题根源
breaks参数仅包含中间分界点,未覆盖<16.0和≥40.0的区间,导致分组不全,x轴缺失首尾区间。- 颜色数量(8种)与实际分组数(6组)不匹配,颜色分配混乱。
- 当
breaks为不等距区间时,基础R的hist默认切换为密度显示,需调整参数强制显示频率。
修正步骤
- 完善分组边界:将
breaks扩展为包含首尾区间的完整边界,确保所有BMI值都能被正确分组。 - 强制显示频率:保留
freq=TRUE参数,强制y轴显示每组的人数(频率)。 - 优化x轴可读性:手动设置x轴刻度标签为对应的BMI分类区间文本,替代默认数值。
修正后代码
Height <- c(1.72, 1.86, 2.1, 1.7, 1.6, 1.67, 1.59, 1.88, 1.7, 1.72, 1.9, 1.88, 1.59, 1.55, 1.91, 1.61, 1.82, 1.66, 1.77, 1.74) Weight <- c(77, 79, 102, 70, 63, 62, 55, 89, 88, 88, 128, 100, 55, 60, 79, 59, 57, 70, 72, 74) BMI <- Weight/Height^2 # 覆盖所有8个区间的完整边界 full_breaks <- c(-Inf, 16, 16.9, 18.4, 24.9, 29.9, 34.9, 39.9, Inf) # 对应区间的颜色配置 bmi_colors <- c("red", "orange", "pink", "green", "blue", "pink", "orange", "red") # 自定义x轴显示的区间标签 x_labels <- c("<16.0", "16.0-16.9", "17.0-18.4", "18.5-24.9", "25.0-29.9", "30.0-34.9", "35.0-39.9", "≥40.0") # 绘制直方图,先隐藏默认x轴 hist(BMI, freq = TRUE, main = "BMI分类直方图", breaks = full_breaks, col = bmi_colors, xaxt = "n", xlab = "BMI分类", ylab = "人数") # 添加自定义x轴标签,位置设为每个区间的中点 axis(1, at = (full_breaks[-1] + full_breaks[-length(full_breaks)])/2, labels = x_labels)
代码说明
full_breaks:用-Inf和Inf兜底,确保所有BMI值都能匹配到对应区间。xaxt = "n":隐藏默认x轴,避免数值刻度与自定义标签冲突。axis():手动添加x轴标签,将标签放置在区间中点,视觉上更贴合柱形位置。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

