生存曲线中多个组的不同颜色类型和线型

Tim*_*ney 2 r ggplot2

我正在尝试为两个不同的人群绘制三种不同癌症的生存图。我希望每种癌症类型都有一种颜色,人群之间的差异是线型(虚线与实线)。所以癌症 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)

mar*_*kus 5

如果您查看返回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)