ggsurv传说和线条粗细

时间:2016-11-03 11:31:27

标签: r ggplot2

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)

不起作用。它绘制了丑陋的黑色线条,这些黑色线条与原始的黑色线条完全对齐。

2 个答案:

答案 0 :(得分:3)

您可以同时使用scale_colorscale_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