11

为了使用 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()

在此处输入图像描述

pl2 <- ggplot(dat, aes(time, nr)) + geom_area()

在此处输入图像描述

4

1 回答 1

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

然后使用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")

在此处输入图像描述

于 2013-05-17T17:41:04.480 回答