如何复现包含风险函数与线性混合效应模型拟合曲线的双面板组合图?
解决ggplot与rms包survplot图形的双面板组合问题
我懂你现在的麻烦——一个是ggplot生成的对象,另一个是rms包survplot输出的基础绘图系统图形,常规的par(mfrow=c(2,1))或者gridExtra直接组合根本行不通。这里给你两个实用的解决方案,按需选择就行:
方法一:把基础图形转成Grob后组合
如果你不想重写风险函数的绘图代码,这个方法最省事。借助gridGraphics包把基础图形转换成ggplot兼容的grob对象,再用patchwork(语法更直观)或者gridExtra拼接:
- 先安装并加载所需包:
install.packages(c("gridGraphics", "patchwork")) library(gridGraphics) library(patchwork)
- 将
survplot的图形转为grob:
# 先清空当前绘图设备 dev.off() # 启动gridGraphics的图形捕获功能 grid.echo() # 绘制你的风险函数图 survplot(p2, what='hazard') # 把捕获到的图形转换成grob对象 p2_grob <- grid.grab()
- 纵向组合两个图形:
# 用patchwork的语法,/ 表示纵向排列,p1在上,转换后的p2在下 p1 / p2_grob
方法二:用ggplot重绘风险函数
要是想让两个图形的风格完全统一,直接用ggplot重绘风险函数是最优解,这样两个都是ggplot对象,组合起来毫无障碍:
- 从psm模型中提取风险函数的相关数据:
# 提取时间点和对应的风险值 hazard_data <- data.frame( time = p2$surv[, 1], hazard = -log(p2$surv[, 2]) )
- 用ggplot绘制风险函数曲线:
p2_ggplot <- ggplot(hazard_data, aes(x = time, y = hazard)) + geom_line() + labs(x = "Time", y = "Hazard") + theme_bw() # 可以和你的p1图形主题统一,让整体风格更协调
- 组合两个ggplot对象:
# 方式一:用patchwork p1 / p2_ggplot # 方式二:用gridExtra library(gridExtra) grid.arrange(p1, p2_ggplot, nrow = 2)
小提示:可以给两个图形设置相同的主题(比如theme_bw()),组合后的双面板图视觉效果会更和谐哦~
内容的提问来源于stack exchange,提问作者statistics123
相关产品推荐
相关产品推荐

