R语言ggplot中geom_polygon仅蓝色多边形显示,其余不显示问题排查
问题原因与解决方案
核心问题分析
你的代码存在三个关键问题,导致除蓝色多边形外其余均无法显示:
- 数据重复错误:
normalgewicht和uebergewicht的顶点数据完全一致,后者会被前者覆盖,且数据本身不符合超重BMI区间的逻辑。 - 坐标轴截断:你设置了
ylim(40, 110),但adipositas_I及后续类别的多边形顶点y值(如128.3、146.6)超出该范围,导致这些多边形被完全裁剪。 - 顶点逻辑偏差:手动定义的顶点未遵循BMI公式的曲线规律,部分顶点顺序可能导致绘制的区域异常。
修正步骤与代码
1. 基于BMI公式生成正确的区域数据
BMI计算公式为:BMI = 体重(kg) / (身高(m))²,通过身高序列生成对应BMI区间的体重曲线,替代手动固定顶点:
# 生成连续的身高序列 height_seq <- seq(150, 210, by = 1) # 定义BMI区间、范围和对应颜色 bmi_config <- tibble( category = c("Untergewicht", "Normalgewicht", "Übergewicht", "Adipositas I", "Adipositas II", "Adipositas III"), bmi_min = c(0, 18.5, 25, 30, 35, 40), bmi_max = c(18.5, 25, 30, 35, 40, Inf), fill_color = c("blue", "green", "yellow", "orange", "red", "darkred") ) # 构造所有BMI类别的闭合多边形数据 bmi_polygons <- map_dfr(seq_len(nrow(bmi_config)), function(i) { current <- bmi_config[i,] # 计算当前BMI区间的上下体重边界 weight_low <- current$bmi_min * (height_seq/100)^2 weight_high <- current$bmi_max * (height_seq/100)^2 # 生成闭合多边形顶点:左到右的上边界 + 右到左的下边界 tibble( height = c(height_seq, rev(height_seq)), weight = c(weight_high, rev(weight_low)), category = current$category, fill_color = current$fill_color ) })
2. 绘制修正后的图表
grafik <- male_players_gefiltert %>% ggplot(aes(x = height_cm, y = weight_kg)) + # 一次性绘制所有BMI背景色块,按类别分组 geom_polygon(data = bmi_polygons, aes(x = height, y = weight, group = category, fill = fill_color), alpha = 0.3) + # 直接使用定义的颜色,不生成默认图例 scale_fill_identity() + geom_point(alpha = 0.1, shape = 15) + xlim(150, 210) + # 调整y轴范围以容纳完整的BMI区域,或根据需求修改 ylim(40, 140) + geom_vline(xintercept = my_height, linetype = "dashed") + geom_hline(yintercept = my_weight, linetype = "dashed") + labs(x = "身高(cm)", y = "体重(kg)", title = "BMI类别分布")
额外说明
- 合并所有BMI区域数据,避免重复调用
geom_polygon,代码更简洁易维护。 - 设置
alpha = 0.3可防止背景色块遮挡前景散点。 - 若必须保留
ylim(40,110),需手动截断Adipositas类别的顶点y值,但会丢失部分BMI区域的完整性。
内容的提问来源于stack exchange,提问作者CyberTigerhai
相关产品推荐
相关产品推荐

