【发布时间】:2021-04-03 08:50:34
【问题描述】:
我正在尝试在此处学习本教程:https://rviews.rstudio.com/2017/09/25/survival-analysis-with-r/(页面底部)。
我稍微修改了本教程的代码,并绘制了对应于 3 个观察值的“楼梯”(即“生存函数”,在下图中的“红色”、“蓝色”、“绿色”)数据:
library(survival)
library(dplyr)
library(ranger)
library(data.table)
library(ggplot2)
library(plotly)
a = na.omit(lung)
a$ID <- seq_along(a[,1])
r_fit <- ranger(Surv(time,status) ~ age + sex + ph.ecog + ph.karno + pat.karno + meal.cal + wt.loss, data = a, mtry = 4,
importance = "permutation", splitrule = "extratrees", verbose = TRUE)
death_times <- r_fit$unique.death.times
surv_prob <-data.frame(r_fit$survival)
avg_prob <- sapply(surv_prob, mean)
plot(r_fit$unique.death.times, r_fit$survival[1,], type = "l", ylim = c(0,1), col = "red", xlab = "Days", ylab = "survival", main = "Survival Curves")
new = a[1:3,]
pred <- predict(r_fit, new, type = 'response')$survival
pred <- data.table(pred)
colnames(pred) <- as.character(r_fit$unique.death.times)
plot(r_fit$unique.death.times, pred[1,], type = "l", col = "red")
lines(r_fit$unique.death.times, r_fit$survival[2,], type = "l", col = "green")
lines(r_fit$unique.death.times, r_fit$survival[3,], type = "l", col = "blue")
从这里开始,我想让上面的情节“互动”。我想这样当您将鼠标移到其中一条曲线上时:
-
属于该曲线的“属性”(来自对象“a”)悬停(例如 ID、年龄、性别、ph.ecog 等)
-
在来自 1) 的同一个“悬停框”中,还显示鼠标悬停在每个位置(对于给定曲线)的 x 坐标(r_fit$unique)和 y 坐标(来自“pred”)
我的计划是先将“grob”对象转换为“ggplot”对象,然后将“ggplot”对象转换为“plotly”对象:
grob= plot(r_fit$unique.death.times, pred[1,], type = "l", col = "red")
basic_plot = ggpubr::as_ggplot(grob)
但是当我尝试检查“basic_plot”时,它显示为“NULL”。
ggplot(f)
Error: `data` must be a data frame, or other object coercible by `fortify()`, not an S3 object with class gg/ggplot
如果这行得通,我最终会将 ggplot 对象转换为 plotly:
plotly_plot = ggplotly(final_plot)
如何制作这个互动情节?
我正在尝试实现与此类似的目标:https://plotly.com/python/v3/ipython-notebooks/survival-analysis-r-vs-python/(靠近页面底部,标题为“不同肿瘤 DNA 谱的寿命”)
(请注意:我正在使用没有 USB 端口或 Internet 连接的计算机,只有 R 和一些预安装的库...我没有“ggplotify”或“survminer”)
【问题讨论】:
-
base绘图不能像ggplot这样的对象工作。你可能需要as.grobcran.r-project.org/web/packages/ggplotify/vignettes/…。或者您是否尝试过在ggplot或plotly开始绘制情节? -
不幸的是,我的工作电脑上没有 ggplotify(没有互联网,没有 USB 端口)
-
啊,在这种情况下,也许在
ggplot中构建绘图并使用ggplotly(或直接在plotly)进行转换。我无法通过手机查看当前信息,但我怀疑此问题已在 stackoverflow.com/a/29583945/10142537 进行了解释。也许grob=plot()返回NULL? -
好的,这就是问题所在,我现在已经添加了答案。我使用的
ggplot代码是一个基本示例,如果您愿意,我可以改进。它更适合ggplot语法,让数据位于单个数据帧(长数据)中,并使用一个geom_line调用而不是 3 个! -
是否可以更改答案,以便: p
标签: r ggplot2 plot plotly data-visualization