生存函数图中的哪条曲线是哪条曲线?
Which curve is which in Survival Function plot?
我正在用生存包绘制生存函数。一切正常,但我怎么知道哪条曲线是哪条曲线?我怎样才能将它添加到图例中?
url <- "http://socserv.mcmaster.ca/jfox/Books/Companion/data/Rossi.txt"
Rossi <- read.table(url, header=TRUE)[,c(1:10)]
km <- survfit(Surv(week, arrest)~race, data=Rossi)
plot(km, lty=c(1 ,2))
不幸的是,plot.survival
函数似乎没有提供一个很好的标记曲线的选项。文档说曲线是按照它们在 print
中出现的顺序绘制的,因此当您改变线条类型或颜色时,您可以弄清楚哪个是哪个。但这不利于分享。
一种替代方法是使用 rms
中的 survplot
函数,它会标记曲线。这是您的示例和 CI 关闭绘图的情况。 (请注意,survplot
不会采用 survfit
对象,因此您必须使用可以读取其结果的函数重新进行估计——此处为 npsurv
。)
library(rms)
survplot(npsurv(Surv(week, arrest)~race, data=Rossi), conf = "none")
查看文档以了解调整图表其他方面的方法,包括用图例替换图中的标签。
how do I know which curve is which?
使用 str()
你可以看到哪些元素在 km
中。
km$strata
显示有 48 个和 10 个元素。这与 km$surv
中前 48 项和后 10 项的下降模式一致
km$surv[1:48]
km$surv[49:58]
所以除了 print()
中顺序的提示之外,对于这个特定的数据集,我们还可以确定前 48 个元素属于 race=black
And how can I add it to a legend?
不像其他模型输出 km
不容易转换为 data.frame。但是,我们可以自己提取元素并创建一个data.frame,然后自己绘制它。
首先,我们创建一个涉及阶层的因素:48 名黑人和 10 名其他人
race <- as.factor(c(rep("black", 48), rep("other", 10)))
df <- data.frame(surv = km$surv, race = race, time = km$time)
接下来我们可以像往常一样绘制它(在我的例子中,使用 ggplot2)。
library(ggplot2)
ggplot(data = df, aes(x = time, y = surv)) +
geom_point(aes(colour = race)) +
geom_line(aes(colour = race)) +
theme_bw()
感谢 Richard 的回答,我找到了一种将正确的名称绘制到正确的曲线上的方法,使用 plot.survfit
:
中使用的基本绘图方式
legend_values <- names(km$strata)
plot(km)
legend(
"topright",
legend=legend_values,
col=1:2,
lty = c(1,1),
horiz=FALSE,
bty='n')
我更喜欢 ggplot 绘图方式,但我喜欢保留 plot.survfit
中的逐步呈现方式。
我正在用生存包绘制生存函数。一切正常,但我怎么知道哪条曲线是哪条曲线?我怎样才能将它添加到图例中?
url <- "http://socserv.mcmaster.ca/jfox/Books/Companion/data/Rossi.txt"
Rossi <- read.table(url, header=TRUE)[,c(1:10)]
km <- survfit(Surv(week, arrest)~race, data=Rossi)
plot(km, lty=c(1 ,2))
不幸的是,plot.survival
函数似乎没有提供一个很好的标记曲线的选项。文档说曲线是按照它们在 print
中出现的顺序绘制的,因此当您改变线条类型或颜色时,您可以弄清楚哪个是哪个。但这不利于分享。
一种替代方法是使用 rms
中的 survplot
函数,它会标记曲线。这是您的示例和 CI 关闭绘图的情况。 (请注意,survplot
不会采用 survfit
对象,因此您必须使用可以读取其结果的函数重新进行估计——此处为 npsurv
。)
library(rms)
survplot(npsurv(Surv(week, arrest)~race, data=Rossi), conf = "none")
查看文档以了解调整图表其他方面的方法,包括用图例替换图中的标签。
how do I know which curve is which?
使用 str()
你可以看到哪些元素在 km
中。
km$strata
显示有 48 个和 10 个元素。这与 km$surv
km$surv[1:48]
km$surv[49:58]
所以除了 print()
中顺序的提示之外,对于这个特定的数据集,我们还可以确定前 48 个元素属于 race=black
And how can I add it to a legend?
不像其他模型输出 km
不容易转换为 data.frame。但是,我们可以自己提取元素并创建一个data.frame,然后自己绘制它。
首先,我们创建一个涉及阶层的因素:48 名黑人和 10 名其他人
race <- as.factor(c(rep("black", 48), rep("other", 10)))
df <- data.frame(surv = km$surv, race = race, time = km$time)
接下来我们可以像往常一样绘制它(在我的例子中,使用 ggplot2)。
library(ggplot2)
ggplot(data = df, aes(x = time, y = surv)) +
geom_point(aes(colour = race)) +
geom_line(aes(colour = race)) +
theme_bw()
感谢 Richard 的回答,我找到了一种将正确的名称绘制到正确的曲线上的方法,使用 plot.survfit
:
legend_values <- names(km$strata)
plot(km)
legend(
"topright",
legend=legend_values,
col=1:2,
lty = c(1,1),
horiz=FALSE,
bty='n')
我更喜欢 ggplot 绘图方式,但我喜欢保留 plot.survfit
中的逐步呈现方式。