为了训练ggplot并提高我编写R函数的技巧,我决定构建一系列函数来生成生存图,并提供各种附加功能。我设法为基本的生存情节建立了一个良好的工作功能,现在我正在接受额外的工作。我想做的一件事是在生存情节之上叠加一个给定时间点风险数量的区域图。我希望它看起来像ggplot的facet_grid
选项,但我没有设法使用此函数。我不希望两个图表绑定,就像我们可以使用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()
答案 0 :(得分:13)
首先,将您的数据融化为长格式。
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()
获取每个地图在单独的facet中,variable
用于划分facetting和子集的数据。 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")