如何为ggsurvplot设置本地Proxima Nova字体?含报错解决
解决ggsurvplot自定义字体报错问题
报错原因
ggsurvplot()返回的是包含绘图对象、图例等元素的列表,而非直接的ggplot对象,因此不能用+直接叠加theme(),这就是你遇到"non-numeric argument to binary operator"报错的核心原因。另外,你还需要激活showtext的字体渲染功能,同时要正确匹配ggsurvplot的字体参数设置逻辑。
解决方案
步骤1:激活showtext字体渲染
在导入字体后必须调用showtext_auto(),确保R使用showtext来处理自定义字体:
library(showtext) # 用单引号包裹路径避免转义问题 font_add("proxima", '~/Library/Fonts/Proxima Nova Font.otf') showtext_auto() # 激活showtext字体渲染
方法一:通过ggsurvplot内置参数直接设置
ggsurvplot自带font.family参数,同时可以在ggtheme中指定基础字体,一次性覆盖所有文本的字体设置:
ggsurvplot( surv_fit, data = df, title = "Survival by Neighborhood SES", xlab = "Time since hospital discharge (years)", ylab = "Survival Probability", legend.title = "Neighborhood", legend.labs = c("Prosperous", "Comfortable", "Mid-Tier", "At-Risk", "Distressed"), font.legend = 9, conf.int = FALSE, censor = FALSE, surv.scale = "percent", break.time.by = 2, pval = TRUE, palette = c("#FFE082", "#FFB300", "#FF8F00", "#EF5350", "#B71C1C"), ggtheme = theme_classic(base_family = "proxima"), # 主题层面指定字体 font.family = "proxima" # 统一设置ggsurvplot所有文本的字体家族 )
方法二:修改ggsurvplot返回的绘图对象
如果需要单独调整theme细节,先将ggsurvplot结果存入变量,再修改其内部的ggplot对象:
# 生成ggsurvplot对象 p <- ggsurvplot( surv_fit, data = df, title = "Survival by Neighborhood SES", xlab = "Time since hospital discharge (years)", ylab = "Survival Probability", legend.title = "Neighborhood", legend.labs = c("Prosperous", "Comfortable", "Mid-Tier", "At-Risk", "Distressed"), font.legend = 9, conf.int = FALSE, censor = FALSE, surv.scale = "percent", break.time.by = 2, pval = TRUE, palette = c("#FFE082", "#FFB300", "#FF8F00", "#EF5350", "#B71C1C"), ggtheme = theme_classic() ) # 针对性修改内部ggplot对象的字体 p$plot <- p$plot + theme( text = element_text(family = "proxima"), axis.text = element_text(family = "proxima"), plot.title = element_text(family = "proxima"), legend.text = element_text(family = "proxima"), legend.title = element_text(family = "proxima") ) # 输出最终绘图 print(p)
注意事项
- 确保字体文件路径正确,优先用单引号包裹路径避免转义错误;
- 如果仍无法识别字体,可使用
font_paths()查看R识别的字体路径,将字体放入对应目录,或用font_files()确认字体是否被正确加载; - ggsurvplot的
font.*参数(如font.title、font.xlab)优先级高于theme设置,若单独设置了这些参数,需确保其family也指定为"proxima"。
内容的提问来源于stack exchange,提问作者Bren
相关产品推荐
相关产品推荐

