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

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

当前生成的直方图:
当前生成的直方图


修正方案

问题根源

  1. breaks参数仅包含中间分界点,未覆盖<16.0和≥40.0的区间,导致分组不全,x轴缺失首尾区间。
  2. 颜色数量(8种)与实际分组数(6组)不匹配,颜色分配混乱。
  3. 当breaks为不等距区间时,基础R的hist默认切换为密度显示,需调整参数强制显示频率。

修正步骤

  1. 完善分组边界:将breaks扩展为包含首尾区间的完整边界,确保所有BMI值都能被正确分组。
  2. 强制显示频率:保留freq=TRUE参数,强制y轴显示每组的人数(频率)。
  3. 优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:15:24