ggplot中的ggsurv函数存在一些问题。
我想用图例和线条样式控制外观的顺序。
我可以看到其他人有类似的问题,但我不理解解决方案
使用标准肺部数据我的问题是
library(GGally)
library(survival)
data(lung)
surv1 <- survfit(Surv(time,status) ~ sex, data = lung)
p1 <- ggsurv(surv1, lty.est=c(1,2), surv.col=c("black", "red" ))
p1 <- p1 + scale_colour_discrete(name = 'sex', breaks = c(1,2), labels=c('XX','XY'))
p1
在这里,我希望图例中的标准值替换为XX和XY。但我得到一个重复的传说。一个具有正确的行属性但名称和颜色错误。另一个具有正确的名称和颜色但行属性错误。
我试图插入
p1 <- p1 + guides(colour = FALSE)
但是删除了传奇的错误部分
我不明白什么?
感谢乌贼的评论,解决方案是:
library(GGally)
library(survival)
data(lung)
surv1 <- survfit(Surv(time,status) ~ sex, data = lung)
p1 <- ggsurv(surv1, lty.est=c(1,2), surv.col=c("black", "red" ))
p1 <- p1 + scale_colour_discrete(name = 'sex', breaks = c(1,2), labels=c('XX','XY'))
p1 <- p1 + guides(linetype = F, colour = guide_legend(override.aes = list(linetype = c(2,1))))
p1
我可以理解,override.aes手动设置图例中使用的线型。我不完全确定linetype = F实际上做了什么,但它确实有效!
第二个问题。如何手动设置线条的粗细(图形和图例中)
添加
p1 <- p1 + geom_line(size=2)
不起作用。它绘制了丑陋的黑色线条,这些黑色线条与原始的黑色线条完全对齐。
答案 0 :(得分:3)
您可以同时使用scale_color
和scale_linetype
来组合图例,确保两个比例具有相同的名称和标签。看起来需要在scale_color_manual
中再次定义颜色。
您可以通过geom_step
添加线条,使用group
对象中的变量ggsurv
设置正确的颜色和线条类型。这样做的缺点是在原件的顶部绘制了第二组线,因此结果看起来并不是特别好。
ggsurv(surv1, lty.est=c(1,2), surv.col=c("black", "red" )) +
scale_color_manual(name = "sex", values = c("black", "red"), labels = c("XX", "YY")) +
scale_linetype_discrete(name = "sex", labels = c("XX", "YY")) +
geom_step(size = 1, aes(color = group, linetype = group))
当你想要改变足够的东西以至于值得建立图表时,有一点是值得的。#34;用ggplot2。这可以通过在模型对象上使用来自 ggfortify 的fortify
来为生存模型完成。
library(ggfortify)
library(ggplot2)
plot.data = fortify(surv1, surv.connect = TRUE)
ggplot(plot.data, aes(time, surv, color = strata)) +
geom_step(aes(linetype = strata), size = 1) +
geom_point(data = subset(plot.data, n.censor > 0), shape = 3, color = "red") +
scale_color_manual(name = "sex", labels = c("XX", "YY"), values = c("black", "red")) +
scale_linetype_discrete(name = "sex", labels = c("XX", "YY")) +
labs(y = "Survival", x = "Time")
答案 1 :(得分:1)
最后由于aosmith的建议,它与ggfortify合作(我不知道)
对于处于相同情况的其他人来说,这是我的代码,我手边可以改变我想要的东西
if(!require(survival)){
install.packages("survival")
}
library(survival)
if(!require(GGally)){
install.packages("GGally")
}
library(GGally)
if(!require(ggplot2)){
install.packages("ggplot2")
}
library(ggplot2)
if(!require(ggfortify)){
install.packages("ggfortify")
}
library(ggfortify)
fit <- survfit(Surv(age_at_ecg, age_at_censor, dod) ~ rs9388451, data = exom)
plot.data = fortify(fit)
p1 <- ggplot(plot.data, aes(time, surv, color = strata))
p1 <- p1 + geom_point(size=0)
p1 <- p1 + geom_step(size=2)
p1 <- p1 + scale_color_manual(name = "rs9388451", labels = c('WT', 'Heterozygote', 'Homozygote'), values = c('black', 'blue', 'red'))
p1 <- p1 + scale_x_continuous(limits=c(30,80),breaks=seq(30,80,10)) # x ticks from 0 to 180 by 30
p1 <- p1 + scale_y_continuous(limits=c(0.80,1),breaks=seq(0.80,1,0.05))
p1 <- p1 + xlab("Age (years)")
p1 <- p1 + ylab('Survival')
p1 <- p1 + theme(panel.background = element_rect(fill="white")) # white plot background
p1 <- p1 + theme(legend.key = element_rect(fill="white"))
p1 <- p1 + theme(axis.title.y=element_text(margin=margin(0,15,0,0))) # Add space to axis title
p1 <- p1 +
theme(axis.text=element_text(size=25,face="bold",colour="black"), axis.title=element_text(size=25,face="bold"))
p1 <- p1 + theme(legend.text = element_text(colour="black", size=15, face="bold"))
p1 <- p1 + theme(legend.title = element_text(colour="black", size=15, face="bold"))
p1