如何调整ggsurv绘制的Kaplan-Meier生存曲线的图例显示顺序
解决方案
你的图例顺序不符合预期的核心原因是R默认将字符类型的分组变量按字母顺序自动排序,只需主动指定分组的排序规则即可解决,优先推荐第一种方案:
方案1:修改原始数据的分组因子顺序(最稳妥,从根源适配所有后续分析)
在调用survfit函数之前,先将fat数据框中的Treatments列转换为自定义顺序的因子:
# 自定义Treatments的排序规则 fat$Treatments <- factor(fat$Treatments, levels = c("100Low", "30Low", "15Low", "100High", "30High", "15High")) # 后续代码和你原有的逻辑完全一致,不需要额外修改 ru <- survfit(Surv(Tf,fat==1) ~ Treatments, data = fat) uu <- ggsurv(ru, CI = "def", plot.cens = TRUE, surv.col = c(1,1,2,2,3,3), cens.col = 1, lty.est = c(1,1,1,5,5,5), size.est = 1.05, cens.shape = 12, cens.size = 3, back.white = FALSE, xlab = "Time (seconds)", ylab = "Ratio of fish remaining", main = "Kaplan-Meier Curves") uu1 <- uu + theme_gray(base_size=13) + theme(legend.position = "right") + theme(legend.title = element_text(face = "bold")) + theme(plot.title = element_text(face = "bold")) + theme(axis.title = element_text(size = 15, face = "bold")) + theme(axis.ticks = element_line(size = 1)) + scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) + scale_y_continuous(breaks = scales::pretty_breaks(n = 10)) + theme(axis.text = element_text(size = 14)) + theme(legend.text = element_text(size = 12)) windows() (uu1)
该方案会直接让survfit按照你指定的顺序分组,后续绘图的图例、颜色、线型映射都会自动匹配你设置的参数。
方案2:不修改原始数据,直接在ggplot图层调整图例顺序
如果你不想改动原始数据,也可以在构建uu1时新增scale_color_manual和scale_linetype_manual指定图例顺序,注意要和你原有参数的颜色、线型设置对应:
# 仅需在你原有uu1的链式操作末尾追加以下两行代码即可 uu1 <- uu + theme_gray(base_size=13) + theme(legend.position = "right") + theme(legend.title = element_text(face = "bold")) + theme(plot.title = element_text(face = "bold")) + theme(axis.title = element_text(size = 15, face = "bold")) + theme(axis.ticks = element_line(size = 1)) + scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) + scale_y_continuous(breaks = scales::pretty_breaks(n = 10)) + theme(axis.text = element_text(size = 14)) + theme(legend.text = element_text(size = 12)) + # 新增以下两行指定图例顺序 scale_color_manual(breaks = c("100Low", "30Low", "15Low", "100High", "30High", "15High"), values = c("black", "black", "red", "red", "blue", "blue")) + scale_linetype_manual(breaks = c("100Low", "30Low", "15Low", "100High", "30High", "15High"), values = c(1,1,1,5,5,5))
内容的提问来源于stack exchange,提问作者Muhammad Usama Ashraf
相关产品推荐
相关产品推荐

