前言
今天小伙伴要我帮他改一个临床决策曲线图,我一看,这图好像有点不那么好看,画图函数是rmda包的plot_decision_curve(),我一看帮助文档,可以传入plot()函数的参数,但是我对plot函数又不太熟悉,倒腾了半天也没美化好(菜是原罪),本着不懂就放弃的原则,我决定用ggplot2去画。
下图一张数原函数化的,一张是ggplot2画的,仔细看,区别还是有的。
先看一下原函数
再看下ggplot2
一、观察数据
本着有坐标就能画图的大胆想法,我决定去看看模型中包含的数据。咦,这thresholds是从0到1的不就是横坐标吗?这NB不就是纵坐标吗?数据都有了说办就办。
二、步骤
1.从模型中提取模型的数据
ggplot2画图需要长数据类型,从一开始就构建好。里面设置的NBL,NBu,CBR没用到。一开始以为有用,害。。。
**提示:**这里面的Nomogram,age,AJCC_8th_edition,SII,CONUT,chemothreapy,是经过decision_curve函数得到的结果。例如:AJCC_8th_edition<- decision_curve(…)。需要生面这部分代码的请使用浏览器。
library(ggplot2)
library(RColorBrewer)
List<-list(Nomogram,age,AJCC_8th_edition,SII,CONUT,chemothreapy)
#为模型命名
names(List) <- c('Nomogram','age','AJCC_8th_edition','SII','CONUT','chemothreapy')
#经观察(踩坑)发现每个模型的303个数据数据分为3部分,只有前1/3是模型本身的,其余分别是All和None。
#因此设置一个长度,别让它读多了
l <- length(List[[1]][["derived.data"]][["NB"]])/3
#设置一个NA数据框用来循环取数据
dc <- data.frame('NBl'=rep(NA,l),
'NB'=rep(NA,l),
'NBu'=rep(NA,l),
'HRT'=rep(NA,l),
'CBR'=rep(NA,l),
'Model'=rep(NA,l))
#建立空数据框用来合并数据
dat <- data.frame()
for (i in names(List)) {
dc$NBl <- List[[i]][["derived.data"]][["NB_lower"]][1:l]
dc$NB<- List[[i]][["derived.data"]][["NB"]][1:l]
dc$NBu <- List[[i]][["derived.data"]][["NB_upper"]][1:l]
dc$HRT <- List[[i]][["derived.data"]][["thresholds"]][1:l]
dc$CBR <- List[[i]][["derived.data"]][["cost.benefit.ratio"]][1:l]
dc$Model <- rep(i,l)
#按行合并
dat <- rbind(dat,dc)
}
2.提取All和None数据
自己的模型数据取完了,但别忘了临床决策曲线中还有All和None两个,对同一数据建的模型All和None是一样的,所以这里就取第一个模型的All和None数据
#正经模型的数据取完了,现在取All和None的
dc$NBl <- List[[1]][["derived.data"]][["NB_lower"]][(2*l+1):(3*l)]
dc$NB<- List[[1]][["derived.data"]][["NB"]][(2*l+1):(3*l)]
dc$NBu <- List[[1]][["derived.data"]][["NB_upper"]][(2*l+1):(3*l)]
dc$HRT <- List[[1]][["derived.data"]][["thresholds"]][(2*l+1):(3*l)]
dc$