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

如何调整stat_poly_eq文本格式?解决系数指数负号错位问题

解决ggplot2+ggpmisc中stat_poly_eq指数负号错位及自定义公式文本不显示问题

一、修复stat_poly_eq指数负号错位问题

你遇到的指数负号上移问题,本质是默认科学计数法的表达式渲染逻辑导致的。可以通过两种方式解决:

方案1:调整stat_poly_eq格式化参数

通过format.args强制规范科学计数法的显示格式,确保负号与指数数字绑定在同一层级:

library(ggpmisc)
library(ggplot2)

v1 <- c(0.04, 0.04, 0.07, 0.07, 0.08, 0.09, 0.1, 0.1, 0.1, 0.11, 0.11, 0.12, 0.12, 0.12, 0.12, 0.13, 0.13, 0.13, 0.13, 0.14)
v2 <- c(2e-06, 1e-05, 4e-06, 2.2e-05, 1.6e-05, 1e-05, 1.8e-05, 2.6e-05, 3.4e-05, 1.7e-05, 2.8e-05, 1.4e-05, 2e-05, 2.4e-05, 2.8e-05, 2.6e-05, 3.4e-05, 3.4e-05, 4.6e-05, 2.6e-05)
ddd <- data.frame(speed = v1, dist = v2)

ggplot(ddd, aes(speed, dist)) +
  geom_point() +
  stat_poly_line(formula = y ~ x) +
  stat_poly_eq(
    use_label(c("eq", "adj.R2")),
    formula = y ~ x,
    format.args = list(scientific = TRUE, digits = 3, scipen = 999),
    parse = TRUE
  )

方案2:手动构建方程表达式

如果方案1仍有问题,直接自定义标签内容,用sprintf生成标准科学计数法字符串,确保渲染逻辑正确:

ggplot(ddd, aes(speed, dist)) +
  geom_point() +
  stat_poly_line(formula = y ~ x) +
  stat_poly_eq(
    aes(label = paste(
      "italic(y) == ", 
      sprintf("%.3e", coef(lm(dist ~ speed, data = ddd))[1]),
      " + ", 
      sprintf("%.3e", coef(lm(dist ~ speed, data = ddd))[2]),
      " %.% italic(x)",
      ", ~~ italic(adj.R^2) == ", 
      sprintf("%.3f", summary(lm(dist ~ speed, data = ddd))$adj.r.squared),
      sep = "")),
    parse = TRUE,
    size = 4
  )

二、修复自定义geom_text不显示问题

你的自定义代码存在两个关键错误:

  1. 数据框名错误:data = ttt应改为data = ddd
  2. 文本位置超出可视范围:x=0和y=0不在当前数据的坐标轴范围内(speed最小值0.04,dist最小值2e-6)

修改后的完整代码:

library(ggplot2)

v1 <- c(0.04, 0.04, 0.07, 0.07, 0.08, 0.09, 0.1, 0.1, 0.1, 0.11, 0.11, 0.12, 0.12, 0.12, 0.12, 0.13, 0.13, 0.13, 0.13, 0.14)
v2 <- c(2e-06, 1e-05, 4e-06, 2.2e-05, 1.6e-05, 1e-05, 1.8e-05, 2.6e-05, 3.4e-05, 1.7e-05, 2.8e-05, 1.4e-05, 2e-05, 2.4e-05, 2.8e-05, 2.6e-05, 3.4e-05, 3.4e-05, 4.6e-05, 2.6e-05)
ddd <- data.frame(speed = v1, dist = v2)

# 拟合模型
m <- lm(dist ~ speed, data = ddd)
# 构建方程表达式(用sprintf规范科学计数法)
eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(adj.R)^2~"="~r2,
                 list(a = sprintf("%.3e", coef(m)[1]),
                      b = sprintf("%.3e", coef(m)[2]),
                      r2 = format(summary(m)$adj.r.squared, digits = 3)))
# 设置文本位置(选择图内可见区域,比如右上角)
dftext <- data.frame(x = 0.12, y = 4e-05, eq = as.character(as.expression(eq)))

ggplot(ddd, aes(speed, dist)) +
  geom_point() +
  geom_smooth(method = "lm", formula = y ~ x, se = FALSE) +
  geom_text(aes(label = eq), data = dftext, parse = TRUE, size = 4)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:40:56