我正在尝试为两个不同的人群绘制三种不同癌症的生存图。我希望每种癌症类型都有一种颜色,人群之间的差异是线型(虚线与实线)。所以癌症 A 是红色的,PopA 有虚线,PopB 有实线,依此类推。
我似乎无法为每个癌症群体获得一种颜色,然后在人群之间改变线型。
我不能在这里发布所有数据,因为它是受保护的,但这里是 df、surv 函数和 ggsurvplot:
library(tidyverse)
library(survminer)
library(survival)
library(KMsurv)
library(ggfortify)
library(ggthemes)
> srv_time_mon <- sample(0:100,200, replace = TRUE)
> cancer <- sample(1:3,200, replace = TRUE)
> alive <- sample(0:1,200, replace = TRUE)
> pop <- sample(1:2,200, replace = TRUE)
> dead <- sample(0:1,200, replace = TRUE)
> df <- data.frame(srv_time_mon,cancer, alive, pop, dead)
> head(df)
srv_time_mon cancer alive pop dead
1 84 1 0 1 1
2 91 2 0 2 0
3 44 1 0 2 1
4 57 2 1 1 0
5 54 1 1 2 0
6 31 3 0 2 1
test <- survfit(Surv(srv_time_mon, dead)~pop+cancer, data=df)
ggsurvplot(test, data=df, conf.int = FALSE,
pval = "Log-Rank p <0.001", title="Kaplan-Meier Curves", break.time.by=12,
risk.table = TRUE,
pval.coord=c(156,0.60), surv.median.line = "v",
legend.labs=c("Pop A Cancer 1", "Pop A Cancer 2", "Pop A Cancer 3", "Pop B Cancer 1",
"Pop B Cancer 2", "Pop B Cancer 3"),
legend.title="", legend = c(0.8,0.83), linetype = c("pop"), palette = "jco")+
scale_linetype_discrete( name="Pop Data", labels=c("A", "B"))
Run Code Online (Sandbox Code Playgroud)
如果您查看返回class的对象的ggsurvplot(),让我们调用它p,您会注意到它不是一个ggplot对象
class(p)
#[1] "ggsurvplot" "ggsurv" "list"
Run Code Online (Sandbox Code Playgroud)
你会在ggplot这里找到对象
class(p$plot)
#[1] "gg" "ggplot"
Run Code Online (Sandbox Code Playgroud)
如果你现在跑
p$plot + scale_linetype_discrete(name = "Pop Data", labels = c("A", "B"))
Run Code Online (Sandbox Code Playgroud)
你会看到这个情节:
现在,如果您想要一个图例,linetype请将ggsurvplot()调用中的参数更改"strata"为组合两个图例,因为现在相同的变量映射到不同的美学。
最后添加scale_linetype_manual()和scale_colour_manual()到p$plot。
请参阅下面的完整代码。
p <- ggsurvplot(
test,
data = df,
conf.int = FALSE,
pval = "Log-Rank p <0.001",
title = "Kaplan-Meier Curves",
break.time.by = 12,
risk.table = TRUE,
pval.coord = c(156, 0.60),
surv.median.line = "v",
legend.labs = c(
"Pop A Cancer 1",
"Pop A Cancer 2",
"Pop A Cancer 3",
"Pop B Cancer 1",
"Pop B Cancer 2",
"Pop B Cancer 3"
),
legend.title = "",
# legend = c(0.8, 0.83), # took this out for cleaner appearance of the legend (optional)
linetype = c("strata"), # changed from "pop" to "strata"
palette = "jco"
)
Run Code Online (Sandbox Code Playgroud)
我假设您希望 2 型和 3 型癌症的颜色为黑色。如果您想要不同的颜色,请更改下面的代码。
cols <- rep(c("red", "black"), c(2, 4))
#cols <- rep(c("red", "forestgreen", "lightblue"), 2) # example
names(cols) <- paste("Pop", rep(c("A", "B"), each = 3), "Cancer", 1:3)
lines <- rep(c("dashed", "solid"), each = 3)
names(lines) <- paste("Pop", rep(c("A", "B"), each = 3), "Cancer", 1:3)
p$plot <- p$plot +
scale_linetype_manual(values = lines) +
scale_colour_manual(values = cols) +
theme(legend.position = "bottom")
Run Code Online (Sandbox Code Playgroud)
ggplot使用patchwork包在绘图下方添加风险表(另一个对象)。
# devtools::install_github("thomasp85/patchwork")
library(patchwork)
p$plot / p$table + plot_layout(ncol = 1, heights = c(3, 1)) +
theme(axis.text.y = element_text(color = rev(cols)))
Run Code Online (Sandbox Code Playgroud)
数据
set.seed(1)
df <- data.frame(
srv_time_mon = sample(0:100, 200, replace = TRUE),
cancer = sample(1:3, 200, replace = TRUE),
alive = sample(0:1, 200, replace = TRUE),
pop = sample(1:2, 200, replace = TRUE),
dead = sample(0:1, 200, replace = TRUE)
)
Run Code Online (Sandbox Code Playgroud)