如何在ggsurvplot中像ggplot2一样自定义刻度与刻度标签?
需求说明
使用ggsurvplot()绘制生存曲线时,需要实现X轴的特殊刻度效果:每个整数对应位置都显示刻度线,但仅每隔一个数值显示刻度标签,而非当前break.time.by=2参数实现的「间隔2个位置才同时出刻度线和标签」的效果。
已知原生ggplot2环境下可以借助ggh4x包配合条件判断实现该效果,但未找到ggsurvplot对应的内置实现方法,当前使用的基础绘图代码如下:
ggsurvplot(fit, data = d, conf.int = F, censor = F, palette = c("green", "purple", "red"), legend.labs = c("Reference water (pH 7.3)\n(N = 66)", "Acidic al-poor (pH 5.8)\n(N = 66)", "Acidic al-rich (pH 5.8)\n(N = 66)"), legend.title = "Water quality", xlab = "Days", xlim = c(1,23), break.time.by = 2 )
实现方法
ggsurvplot()返回的对象本身就包含原生ggplot对象,完全可以直接用ggplot2的语法调整坐标轴,不需要依赖额外扩展包,操作逻辑很简单:
- 第一步:把原代码里的
break.time.by参数从2改成1,让X轴在1-23的每个整数位置都生成刻度线 - 第二步:单独调整X轴的标签显示规则,只在需要的间隔位置保留标签,其余位置的标签设为空字符串即可。
完整可运行代码如下:
library(survminer) library(ggplot2) # 生成基础生存图 surv_p <- ggsurvplot(fit, data = d, conf.int = FALSE, censor = FALSE, palette = c("green", "purple", "red"), legend.labs = c("Reference water (pH 7.3)\n(N = 66)", "Acidic al-poor (pH 5.8)\n(N = 66)", "Acidic al-rich (pH 5.8)\n(N = 66)"), legend.title = "Water quality", xlab = "Days", xlim = c(1,23), break.time.by = 1 # 所有整数位置都生成刻度 ) # 调整X轴标签:仅每隔1个刻度显示数值,其余位置隐藏标签 surv_p$plot <- surv_p$plot + scale_x_continuous( breaks = 1:23, # 下面的判断规则如果要从1开始显示标签,就把==0改成==1 labels = ~ifelse(.x %% 2 == 0, as.character(.x), ""), limits = c(1,23) ) # 输出图形 print(surv_p)
如果要做出主刻度(带标签)和次刻度(不带标签)的长度区分,可以再加一层主题设置:
surv_p$plot <- surv_p$plot + theme( # 主刻度长度设为0.2cm,次刻度长度设为0.1cm,可按需调整数值 axis.ticks.length.x = unit(c(0.2, 0.1), "cm") )
内容的提问来源于stack exchange,提问作者asellus
相关产品推荐
相关产品推荐

