如何在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
相关产品推荐
相关产品推荐

