如何调整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不显示问题
你的自定义代码存在两个关键错误:
- 数据框名错误:
data = ttt应改为data = ddd - 文本位置超出可视范围:
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
相关产品推荐
相关产品推荐

