背景
用R代码画出文章PMID: 21606424里的图。

使用场景
根据肿瘤大小分组,以存活时间作为输入,计算死亡率。
展示死亡率与肿瘤大小的关系。
还可以用来展示转移率与肿瘤大小的关系。
输入数据及处理
x = read.csv("easy_input.csv")
head(x)
## 第一列Survival里的1为死亡事件,其它当一类处理,你可以按照实现的标记灵活处理一下。
x前几行如下:

## 第二列Time的时间单位是月,5年即60个月。
## 5年之后死的,5年内是活的,把超过5年之后死的改为活的。
x$Survival[x$Survival == 1 & x$Time > 60 ] = 0
head(x)
## 或者按步长为2切,然后group_by,用这个group变量,画图Tumor.size改成这个group,就可以是按照2mm来算了,要多少mm算一组都可以。
#x$group = cut(x$Tumor.size, seq(0, 50, 2), seq(0, 50-1, 2) + 1) %>% as.character %>% as.numeric
## 按照Tumor size切分,计算死亡率,及0.95的置信区间
require(dplyr)
y <- group_by(x, Tumor.size) %>%
summarize(ratio = mean(Survival == 1),
int95 = qt(0.975, length(Survival)-1) * sd(Survival==1)/sqrt(length(Survival)))
head(y)
y前几行如下:

开始画图
require(ggplot2)
p1 <-ggplot(y, aes(Tumor.size, ratio)) +
geom_ribbon(aes(ymin=ratio-int95, ymax=ratio+int95), fill="grey") +
geom_line() + xlab("Tumor Size (mm)") +
ylab("5-Year XXX Mortality") + theme_minimal()
p1

这个图不够平滑,因为Tumor.size是正整数的,都是离散点。
可以使用Local Regression,也就是LOESS来处理,使之平滑。
#可以试着更改一下span参数,指定多少的smoothing span
span <- 0.5
loess_ratio <- loess(ratio ~ Tumor.size, data=y, span=span)
loess_ci <- loess(int95 ~ Tumor.size, data=y, span=span)
y$ratiop = predict(loess_ratio)
y$int95p = predict(loess_ci)
p2 <-ggplot(y, aes(Tumor.size, ratiop)) +
geom_ribbon(aes(ymin=ratiop-int95p, ymax=ratiop+int95p), fill="grey") +
geom_line() + xlab("Tumor Size (mm)") +
coord_cartesian(xlim = c(0,51),ylim = c(0,0.3)) + #设置坐标轴范围
scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0)) +#让x和y轴都从0开始
theme_bw() + #去除背景色
theme(panel.grid =element_blank()) + #去除网格线
theme(panel.border = element_blank()) + #去除外层边框
theme(axis.line = element_line(colour = "black")) + #坐标轴画成黑色
ylab("5-Year XXX Mortality")
p2
ggsave("mortality.pdf",width = 6,height = 4)

p2画出来就非常好看了
把没做smoothing的叠加上去看看:
p2 + geom_ribbon(aes(ymin=ratio-int95, ymax=ratio+int95), fill="steelblue", alpha=.3) +
geom_line(aes(Tumor.size, ratio), color='red') + xlab("Tumor Size (mm)") +
ylab("5-Year XXX Mortality") + theme_minimal()
