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

如何在R中绘制美观的风险比(Hazard Ratio)图表?

用Broom+ggplot2制作Cox模型的美观风险比森林图

你之前尝试的geom_boxplot不适合风险比图表,这类图需要展示每个变量的**风险比(HR)**及95%置信区间,而非箱线图。以下是完整的实现步骤:

1. 加载依赖包并处理模型结果

首先提取模型的系数、置信区间和p值,并转换为实际风险比(Cox模型输出的是对数HR,需取指数转换):

library(tidyverse)
library(broom)
library(survival)

# 你的Cox模型
sigMod = coxph(Surv(time, DEATH_EVENT) ~ age+anaemia+creatinine_phosphokinase+ejection_fraction+
                serum_creatinine+hypertension, data=HF)

# 整理模型结果,计算HR和置信区间
model_tidy <- tidy(sigMod, conf.int = TRUE) %>%
  mutate(
    # 转换为实际风险比
    hr = exp(estimate),
    conf_low = exp(conf.low),
    conf_high = exp(conf.high),
    # 添加显著性标记
    sig_label = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      TRUE ~ ""
    ),
    # 格式化HR和置信区间为文本
    hr_ci_text = sprintf("%.2f (%.2f-%.2f)", hr, conf_low, conf_high)
  ) %>%
  # 按HR值排序变量,提升可读性
  arrange(hr) %>%
  mutate(term = fct_reorder(term, hr))

2. 绘制美观的森林图

用ggplot构建包含HR点、置信区间、标注和参考线的图表:

ggplot(model_tidy, aes(x = hr, y = term)) +
  # 添加HR=1的基准参考线(无风险关联)
  geom_vline(xintercept = 1, linetype = "dashed", color = "gray50") +
  # 绘制横向置信区间
  geom_errorbarh(aes(xmin = conf_low, xmax = conf_high), height = 0.2, color = "#2c3e50") +
  # 绘制HR点
  geom_point(size = 3, color = "#e74c3c") +
  # 添加HR和置信区间的文本标注
  geom_text(aes(label = hr_ci_text), hjust = -0.1, size = 3.5) +
  # 添加显著性标记
  geom_text(aes(label = sig_label), hjust = 1.1, color = "#e74c3c", size = 4) +
  # 设置图表标签
  labs(
    x = "风险比 (HR)",
    y = "变量",
    title = "Cox比例风险模型风险比森林图",
    subtitle = "带95%置信区间与显著性标记"
  ) +
  # 应用简洁主题并调整样式
  theme_bw() +
  theme(
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
    plot.subtitle = element_text(size = 12, hjust = 0.5),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10)
  ) +
  # 扩展x轴右侧范围,避免标注被截断
  scale_x_continuous(expand = expansion(mult = c(0, 0.3)))

关键细节说明

  • tidy(conf.int = TRUE):必须开启该参数才能提取95%置信区间。
  • exp()转换:Cox模型的系数是对数尺度的风险比,取指数后才是临床解读的实际HR值。
  • fct_reorder():按HR值排序变量,让图表从风险降低到风险升高依次排列,更易对比。
  • 参考线:HR=1是风险无差异的基准,区间包含1说明该变量无统计学意义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:50:40