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

如何在R语言ggplot2的标题中添加上标(如R²)?

解决ggplot2标题中R²上标及动态数值嵌入问题

问题分析

你尝试用expression和paste组合的方式存在错误:expression无法直接与paste结合生成可解析的数学表达式,同时代码存在括号语法错误,导致标题无法正确生成。

解决方案1:使用bquote解析数学表达式(无需额外包)

bquote可以将动态计算的数值嵌入到数学表达式中,ggplot能直接解析这类表达式渲染上标:

ggplotRegression <- function(fit) {
  require(ggplot2)
  
  # 提前提取统计值,让代码更清晰
  r2 <- signif(summary(fit)$r.squared, 5)
  intercept <- signif(fit$coef[[1]], 5)
  slope <- signif(fit$coef[[2]], 5)
  p_val <- signif(summary(fit)$coef[2,4], 5)
  
  ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) + 
    geom_point() +
    stat_smooth(method = "lm") +
    labs(title = bquote(R^2 == .(r2) ~ " Intercept =" ~ .(intercept) ~ " Slope =" ~ .(slope) ~ " P =" ~ .(p_val))) +
    theme(plot.title = element_text(hjust = 0.5)) # 可选:设置标题居中
}

# 调用函数
ggplotRegression(lm(TOA_NDVI ~ Field_NDVI, data = NDVI_type))

代码说明:

  • R^2是R数学表达式的上标写法,.(r2)用于将变量r2的数值嵌入表达式
  • ~符号用于在表达式中添加空格,分隔文本与数值
  • 无需额外设置解析参数,ggplot会自动处理bquote生成的表达式

解决方案2:使用ggtext包的markdown语法(更直观)

如果觉得数学表达式语法繁琐,可借助ggtext包支持的markdown上标语法,代码可读性更强:

# 首次使用需安装包
# install.packages("ggtext")

ggplotRegression <- function(fit) {
  require(ggplot2)
  require(ggtext)
  
  # 提取统计值
  r2 <- signif(summary(fit)$r.squared, 5)
  intercept <- signif(fit$coef[[1]], 5)
  slope <- signif(fit$coef[[2]], 5)
  p_val <- signif(summary(fit)$coef[2,4], 5)
  
  # 用markdown语法编写标题,<sup>2</sup>表示上标
  title_text <- glue::glue("R<sup>2</sup> = {r2}  Intercept = {intercept}  Slope = {slope}  P = {p_val}")
  
  ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) + 
    geom_point() +
    stat_smooth(method = "lm") +
    labs(title = title_text) +
    theme(plot.title = element_markdown(hjust = 0.5)) # 必须设置此参数解析markdown
}

# 调用函数
ggplotRegression(lm(TOA_NDVI ~ Field_NDVI, data = NDVI_type))

代码说明:

  • R<sup>2</sup>是标准markdown上标语法,直观易写
  • glue::glue用于简洁嵌入动态数值(也可替换为paste0,但glue语法更清晰)
  • 必须设置plot.title = element_markdown(),否则markdown语法不会被解析

额外提示

如果你使用的是ggplot2新版本,aes_string已被推荐使用aes(.data[[...]])替代,可修改为:

aes(x = .data[[names(fit$model)[2]]], y = .data[[names(fit$model)[1]]])

内容的提问来源于stack exchange,提问作者Rpearce33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:00:49