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

如何用R ggplot绘制固定0-100岁区间的患病率热力图

解决ggplot热力图按原始年龄区间填充并固定X轴刻度的问题

核心思路是保留原始数据的年龄区间边界,将其映射到固定的0-100岁(每10岁一个刻度)的X轴框架中,用精准的色块宽度匹配原始区间,而非强行拆分原始区间。

1. 数据预处理

假设你的数据结构如下(模拟样例):

# 模拟数据:包含研究名称、年龄区间上下限、患病率
df <- data.frame(
  study = c("Study A", "Study A", "Study B", "Study B"),
  age_low = c(0, 40, 10, 60),
  age_high = c(39, 79, 59, 99),
  prevalence = c(0.12, 0.25, 0.18, 0.30)
)

如果你的原始数据是用区间字符串(如"0-39")存储的,先拆分出上下限:

# 拆分年龄区间字符串为数值型上下限
df$age_low <- as.numeric(sub("-.*", "", df$age_interval))
df$age_high <- as.numeric(sub(".*-", "", df$age_interval))

2. 调整后的绘图代码

用geom_rect替代常规的geom_tile,精准控制每个色块的宽度:

library(ggplot2)

# 定义目标X轴刻度:0-100岁,每10岁一个刻度
target_age_breaks <- seq(0, 100, 10)

ggplot(df, aes(y = study)) +
  # 绘制匹配原始年龄区间的色块
  geom_rect(
    aes(xmin = age_low, xmax = age_high, fill = prevalence),
    color = "white", # 色块间的分隔线
    size = 0.5
  ) +
  # 固定X轴刻度与范围
  scale_x_continuous(
    breaks = target_age_breaks,
    limits = c(0, 100),
    expand = c(0, 0) # 去除X轴两端空白
  ) +
  # 设置填充色标(可根据需求替换配色)
  scale_fill_viridis_c(name = "Prevalence") +
  # 轴标签设置
  labs(x = "Age (years)", y = "Study") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.grid.major.x = element_line(color = "gray80", size = 0.3)
  )

3. 关键细节说明

  • geom_rect的xmin/xmax参数直接绑定原始数据的年龄区间上下限,确保色块完全匹配原始区间范围。
  • scale_x_continuous强制X轴显示0-100的每10岁刻度,同时锁定绘图范围,避免原始区间偏移。
  • 如果原始数据存在跨10岁刻度的区间(如15-45),该方法依然能准确绘制对应宽度的色块,不会拆分区间。

内容的提问来源于stack exchange,提问作者Hyolim Kang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:55:33