【问题标题】:Stacke different plots in a facet manner以刻面方式堆叠不同的图
【发布时间】:2013-05-17 17:29:59
【问题描述】:

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

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    首先,将您的数据融合为长格式。

    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() 仅使用geom_step() 中的surv 数据和geom_area() 中的nr 数据以及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")
    

    【讨论】:

    • 仅供其他人参考,对于这么简单的过滤器,'subset'函数不是必需的。 dat.long[dat.long$variable=="surv", ] 将产生与subset(dat.long,variable=="surv") 相同的结果。这两种方法都不是特别优越,但很高兴了解这些选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多