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

ggplot2直方图着色问题求助:按体温梯度设置填充色

问题描述

使用ggplot2绘制医院患者体温直方图时,需要实现按体温梯度着色:X轴为体温,低体温(如36℃)用绿色、中等体温(如38℃)用黄色、高体温(如40℃)用红色;Y轴展示各体温区间的出现频次。当前使用的ggplot2代码如下:

ggplot(Hospital, aes(x=BodyTemperature)) +
  geom_histogram(aes(fill = factor(BodyTemperature))) +
  scale_x_continuous(breaks = seq(0, 100, by = 10)) +
  ylab("prevalence") + 
  xlab("BodyTemperature") +
  ggtitle("Temperature vs. prevalence")

已实现的base R版本可行代码:

color1 <- rep(brewer.pal(1, "Greens"))
color2 <- rep("#57c4fa", 0)
color3 <- brewer.pal(8, "Reds")
hist(Hospital$BodyTemperature[-357],
  breaks = seq(from = 0, to = 100, by = 10),
  main = "Temperature vs. prevalence", 
  ylab("prevalence"),
  xlab("Temperature"), 
  col = c(color1, color2, color3))

需要修正上述ggplot2代码,实现按体温梯度着色的效果。

修正方案

原代码的问题在于将BodyTemperature转为因子后,每个独立体温值对应一个颜色,无法实现梯度着色。以下提供两种贴合需求的修正方式:

方法1:对齐base R的区间固定着色

完全匹配base R代码的区间划分与颜色逻辑,为每个体温区间指定对应颜色:

library(ggplot2)
library(RColorBrewer)

# 移除异常值,与base R代码保持一致
hospital_clean <- Hospital[-357, ]

# 定义区间与对应颜色
breaks <- seq(0, 100, by = 10)
color_palette <- c(brewer.pal(1, "Greens"), rep("#57c4fa", 0), brewer.pal(8, "Reds"))

ggplot(hospital_clean, aes(x = BodyTemperature)) +
  geom_histogram(breaks = breaks, aes(fill = cut(BodyTemperature, breaks = breaks))) +
  scale_fill_manual(values = color_palette, name = "Temperature Range") +
  scale_x_continuous(breaks = breaks) +
  labs(y = "prevalence", x = "BodyTemperature", title = "Temperature vs. prevalence")

方法2:平滑梯度着色(更贴合需求描述)

实现从绿到黄再到红的连续颜色渐变,直观体现体温高低的色彩变化:

library(ggplot2)

hospital_clean <- Hospital[-357, ]

ggplot(hospital_clean, aes(x = BodyTemperature)) +
  geom_histogram(aes(fill = after_stat(x)), bins = 10) + # bins数量对应步长10的区间数
  scale_fill_gradientn(colors = c("green", "yellow", "red"), 
                       name = "Body Temperature (℃)",
                       limits = c(30, 42)) + # 可根据实际体温范围调整
  scale_x_continuous(breaks = seq(0, 100, by = 10)) +
  labs(y = "prevalence", x = "BodyTemperature", title = "Temperature vs. prevalence")

关键说明

  • 方法1严格对齐base R的区间和颜色设置,适合需要和旧图保持一致的场景;
  • 方法2的平滑渐变更符合“低绿中黄高红”的直观需求,视觉上更连贯;
  • 两种方案都移除了原数据中的第357行异常值,与base R代码逻辑统一。

内容的提问来源于stack exchange,提问作者Harry Plotter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:20:46