Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

swimmer survival plot

Is there an easy way to generate a swimmer plot in R? Same data as in a KM curve but with each individual survival represented as a line. Example:

I've searched stackoverflow, the R-help mailing list, and consulted Dr. Google without an obvious answer, though my search technique may be suboptimal. Thank you!

**** ADDENDED **** Apologies for not appropriately asking a question - this is my first time! Playing around, I've been able to do the following:

          OS DeathYN TreatmentGroup
4   444 days       1              0
5   553 days       1              0
8   812 days       0              0
1   844 days       0              0
10 1071 days       0              0
9  1147 days       0              0
6  1349 days       0              0
3  1375 days       0              0
2  1384 days       0              1
7  1687 days       0              0

orderedData$GroupColor[orderedData$TreatmentGroup==0] <- "yellow"
orderedData$GroupColor[orderedData$TreatmentGroup==1] <- "red"
orderedData$YCoord <- barplot(as.numeric(orderedData$OS), horiz=TRUE,  col=orderedData$GroupColor, xlim=c(0,max(orderedData$OS) + 50), xlab="Overall Survival")
points(x=20+as.numeric(orderedData$OS), y=orderedData$YCoord,pch=62, col="green")
legend(1000,2, c("Control", "Treatment", "still living"), col=c("yellow","red", "green"), lty=1, lwd=c(10,10,0),pch=62)

This gets me close enough for now, but aesthetics are not perfect. If there is a package or a better solution someone can suggest I'd love to see it!

like image 485
Dave Liu Avatar asked Oct 14 '15 16:10

Dave Liu


People also ask

What is a swimmer plot?

Stacey says in her paper that often "investigators prefer to dig deeper and look at an individual subject’s pattern of response. A swimmer plot is a graphical way of showing multiple pieces of a subject’s response 'story' in one glance.".

How can we use “swimmer plots” to visualize survival data?

This is an RMarkdown explaining how we can use “Swimmer Plots” to visualize survival data. A “Swimmer Plot” is a graphical way of displaying several aspects of a subject’s tumor response such as total time to tumor response, whether there was a “Complete” or “Partial” response, and duration of response.

What can swimmer Lane plots tell us?

Swimmer Lane plots can visually tell each subject’s response story with exact data labels, such as, which time point has Complete Response, or which point has Disease Progression (PD), or Death. Different colored bars distinguish different types of tumor or stage.

How do I add layers to a swimmer plot?

The “swimmer” package has a variety of functions which add layers to a swimmer plot by implementing ggplot functions. This vignette goes through examples to create swimmers plots, and demonstrates converting a dataframe to the required format.


1 Answers

You asked for an "easy" way to generate a swimmer plot. This is probably a bit more involved than you were hoping for, but it's pretty close to what you posted. If you need to make a lot of swimmer plots, you can tweak this into something that works for you and then turn it into a function.

First create some fake data:

library(ggplot2)
library(reshape2)
library(dplyr)
library(grid)

set.seed(33)
dat = data.frame(Subject = 1:10, 
                 Months = sample(4:20, 10, replace=TRUE),
                 Treated=sample(0:1, 10, replace=TRUE),
                 Stage = sample(1:4, 10, replace=TRUE),
                 Continued=sample(0:1, 10, replace=TRUE))

dat = dat %>%
  group_by(Subject) %>%
  mutate(Complete=sample(c(4:(max(Months)-1),NA), 1, 
                         prob=c(rep(1, length(4:(max(Months)-1))),5), replace=TRUE),
         Partial=sample(c(4:(max(Months)-1),NA), 1, 
                        prob=c(rep(1, length(4:(max(Months)-1))),5), replace=TRUE),
         Durable=sample(c(-0.5,NA), 1, replace=TRUE))

# Order Subjects by Months
dat$Subject = factor(dat$Subject, levels=dat$Subject[order(dat$Months)])

# Melt part of data frame for adding points to bars
dat.m = melt(dat %>% select(Subject, Months, Complete, Partial, Durable),
             id.var=c("Subject","Months"))

Now for the plot:

ggplot(dat, aes(Subject, Months)) +
  geom_bar(stat="identity", aes(fill=factor(Stage)), width=0.7) +
  geom_point(data=dat.m, 
             aes(Subject, value, colour=variable, shape=variable), size=4) +
  geom_segment(data=dat %>% filter(Continued==1), 
             aes(x=Subject, xend=Subject, y=Months + 0.1, yend=Months + 1), 
             pch=15, size=0.8, arrow=arrow(type="closed", length=unit(0.1,"in"))) +
  coord_flip() +
  scale_fill_manual(values=hcl(seq(15,375,length.out=5)[1:4],100,70)) +
  scale_colour_manual(values=c(hcl(seq(15,375,length.out=3)[1:2],100,40),"black")) +
  scale_y_continuous(limits=c(-1,20), breaks=0:20) +
  labs(fill="Disease Stage", colour="", shape="", 
       x="Subject Recevied Study Drug") +
  theme_bw() +
  theme(panel.grid.minor=element_blank(),
        panel.grid.major=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())

enter image description here

like image 188
eipi10 Avatar answered Sep 20 '22 07:09

eipi10