Stacke不同的情节以小平面的方式

Edw*_*win 11 r ggplot2

为了训练ggplot并提高我编写R函数的技能,我决定构建一系列函数来生成生存图,并提供各种附加功能.我设法为基本的生存情节建立了一个良好的工作功能,现在我正在接受额外的工作.我想做的一件事是在生存图之上叠加一个给定时间点风险数量的区域图.我希望它看起来像facet_gridggplot 的选项,但我没有设法用这个功能.我不希望两个图表绑定,就像我们可以做的那样grid.arrange,而是具有相同的x轴.

下面的代码生成了两个(简化的)图,我想将它们叠加在一起.我试图这样做facet_grid,但我不认为解决方案在于此

library(survival)
library(ggplot2)
data(lung)
s <- survfit(Surv(time, status) ~ 1, data = lung)
dat <- data.frame(time = c(0, s$time),
                  surv = c(1, s$surv),
                  nr = c(s$n, s$n.risk))
pl1 <- ggplot(dat, aes(time, surv)) + geom_step()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

pl2 <- ggplot(dat, aes(time, nr)) + geom_area()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Did*_*rts 14

首先,将您的数据融化为长格式.

library(reshape2)
dat.long<-melt(dat,id.vars="time")
head(dat.long)
  time variable     value
1    0     surv 1.0000000
2    5     surv 0.9956140
3   11     surv 0.9824561
4   12     surv 0.9780702
5   13     surv 0.9692982
6   15     surv 0.9649123
Run Code Online (Sandbox Code Playgroud)

然后用subset()只用surv数据geom_step()nr数据geom_area(),并与facet_grid()您将获得每个地块在单独的小面variable用于为磨制和子集划分的数据.scales="free_y"将制作漂亮的轴.

ggplot()+geom_step(data=subset(dat.long,variable=="surv"),aes(time,value))+
  geom_area(data=subset(dat.long,variable=="nr"),aes(time,value))+
  facet_grid(variable~.,scales="free_y")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 仅供其他人参考,"子集"功能对于这样一个简单的过滤器不是必需的.`dat.long [dat.long $ variable =="surv",]`将产生与`subset(dat.long,variable =="surv")`相同的结果.这两种方法都不是特别优越,但了解选项很好. (2认同)