近期要做一个叠加Y轴局部放大的双生存曲线图,总结了一些经验和模板。
样图1来自https://www.nejm.org/doi/full/10.1056/NEJMoa1800410,
样图2来自https://pubmed.ncbi.nlm.nih.gov/34708996/。
小编搜索网络,发现一些文章也有阐述,但是prism和sas输出图比较丑。R设置复杂,但缺少详细教程。
survminer包的ggsurvplot()函数和ggsurvfit包survfit2 可实现NEJM格式。
survminer::ggsurvplot函数设定risk.table类型:推荐risk.table= “nrisk_cumevents”, 格式有"absolute" 、 "percentage"、 "abs_pct"、 "nrisk_cumcensor" 、"nrisk_cumevents";也可以直接TRUE或FALSE。曲线形式参数推荐fun = "event", 具体有"event"绘制累计风险概率图 (f(y)=1-y);"cumhaz"绘制累计风险(HR);"pct"绘制生存概率(用百分比表示),默认为生存曲线pct。图形支持置信区间和经典杂志配色,推荐npg。Survminer包的优势是足够灵活,p值、图例等等自定义十分优秀。2条KM曲线合并的难点在于ggsurvplot函数输出是list,其中plot和table是分离。
ggsurvfit支持expand = c(0, 0)坐标轴(0,0)起始。add_pvalue 参数用于显示P值,但是add_pvalue(location = "annotation", x = 4) 则p值图上会冲突risktable。官网案例见https://www.danieldsjoberg.com/ggsurvfit/articles/gallery.html 。ggsurvfit 图例需要提前factor定义水平,尽管如此,在no at risk的时候,最左侧依然有bug显示不全。
ggsurvfit:: ggcuminc函数同时支持竞争风险函数,但是中文不友好需要设为英文xy标题。
#================ ggsurvfit包survfit2 函数======================
pacman::p_load(ggsurvfit,patchwork)
fit <- survfit2(Surv(totalevent_scxf_timecox,totalevent_scxf) ~ sbpgroup4, data = xz)
#ggsurvfit包将绘图代码打包成了ggsurvfit()函数
fit %>% ggsurvfit()
#① survfit2函数,cumhaz累积风险xy轴单位
p1 <- survfit2(Surv(totalevent_scxf_timecox,totalevent_scxf) ~ sbpgroup4, data = xz) %>%
ggsurvfit(linewidth = 0.8, type = "survival") + #生存曲线宽度
#“survival”生存分析, “risk”, “cumhaz”累积风险
add_confidence_interval() + # 添加置信区间
theme_classic(base_size = 12) + #theme_classic theme_bw主题
add_pvalue(caption = "Log-rank {p.value}") + #p值右下角
#add_pvalue(location = "annotation", x = 4) #p值图上会冲突risktable
theme(legend.position = c(0.2, 0.2))+
add_risktable(size = 3, risktable_height = 0.30) +
#款式1 at risk 和 events分开;
#款式2 at risk(event)
#add_risktable(risktable_stats = "{n.risk} ({cum.event})")
#add_risktable_strata_symbol(symbol = "\U25CF", size = 10)+ #圆点水平
#增加at risk 和 events tables
#add_censor_mark() 增加删失值
#add_quantile(linetype = 2, color = "red") 添加四分位线,默认添加中位线
labs(title = "Modified", x="Follow up time, years",y = "Cumulative incidence")
ggsci::scale_fill_nejm()
p1
# |> 等于 %>% ;
ggsave("p1.pdf", p1, width = 8, height =6 , device = cairo_pdf, family = "Times")
#inset_element会导致risktable消失
#p1 +inset_element(p2,left = 0.5, bottom = 0.5, right = 0.99, top = 0.99)
......
......
#---④ 竞争风险 ggcuminc;death竞争
library(tidycmprsk)
p6 <- survfit2(Surv(death_scxf_timecox,as.factor(death_scxf)) ~ sbpgroup4, xz) %>%
ggcuminc(outcome = "1") +
#012竞争分类,y为事件1
add_confidence_interval() +
add_risktable()
p6
#竞争风险,变量分类为“death from cancer"、"death other causes”、“censor”
#案例为 outcome = "death from cancer"
survminer和ggsurvfit包前者更完善,后者稍有bug但是y轴可自动缩放最优,也可定义分组图例。
获取完全代码请尽快后台留言(代码仅保留7天): ggsurvfit双图