You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:42:22