在一个分面的方式下堆叠不同的图表

11
为了训练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()
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")

enter image description here


2
仅供参考,对于如此简单的过滤器,'subset'函数并不是必需的。dat.long[dat.long$variable=="surv", ]将产生与subset(dat.long,variable=="surv")相同的结果。两种方法都没有特别优越的地方,但了解这些选项是很好的。 - Dinre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接