r - 我们能否将回归方程与 R2 和 p 值巧妙地对齐?
问题描述
将回归方程、R2 和 p 值(对于方程)巧妙地添加到ggplot图中的最佳(最简单)方法是什么?理想情况下,它应该与组和分面兼容。
第一个图具有回归方程加上 r2 和使用ggpubr分组的 p 值,但它们没有对齐?我错过了什么吗?它们可以作为一个字符串包含吗?
library(ggplot)
library(ggpubr)
ggplot(mtcars, aes(x = wt, y = mpg, group = cyl))+
geom_smooth(method="lm")+
geom_point()+
stat_regline_equation()+
stat_cor(aes(label = paste(..rr.label.., ..p.label.., sep = "*`,`~")),
label.x.npc = "centre")
这是ggpmisc的一个选项,它做了一些奇怪的放置。
编辑奇怪的位置是由 引起的geom=text
,我已将其注释掉以提供更好的位置,并添加了 `label.x = "right" 以停止过度绘制。由于@dc37 标记的上标问题,我们仍然有根据ggpubr的错位
#https://stackoverflow.com/a/37708832/4927395
library(ggpmisc)
ggplot(mtcars, aes(x = wt, y = mpg, group = cyl))+
geom_smooth(method="lm")+
geom_point()+
stat_poly_eq(formula = "y~x",
aes(label = paste(..eq.label.., ..rr.label.., sep = "*`,`~")),
parse = TRUE)+
stat_fit_glance(method = 'lm',
method.args = list(formula = "y~x"),
#geom = 'text',
aes(label = paste("P-value = ", signif(..p.value.., digits = 4), sep = "")))
我确实找到了一个很好的解决方案来将相关的统计数据整合在一起,但这需要在 ggplot 之外创建回归,以及一堆字符串操作绒毛——这是否很容易?此外,它不(按当前编码)处理分组,也不处理分面。
#https://stackoverflow.com/a/51974753/4927395
#Solution as one string, equation, R2 and p-value
lm_eqn <- function(df, y, x){
formula = as.formula(sprintf('%s ~ %s', y, x))
m <- lm(formula, data=df);
# formating the values into a summary string to print out
# ~ give some space, but equal size and comma need to be quoted
eq <- substitute(italic(target) == a + b %.% italic(input)*","~~italic(r)^2~"="~r2*","~~p~"="~italic(pvalue),
list(target = y,
input = x,
a = format(as.vector(coef(m)[1]), digits = 2),
b = format(as.vector(coef(m)[2]), digits = 2),
r2 = format(summary(m)$r.squared, digits = 3),
# getting the pvalue is painful
pvalue = format(summary(m)$coefficients[2,'Pr(>|t|)'], digits=1)
)
)
as.character(as.expression(eq));
}
ggplot(mtcars, aes(x = wt, y = mpg, group=cyl))+
geom_point() +
geom_text(x=3,y=30,label=lm_eqn(mtcars, 'wt','mpg'),color='red',parse=T) +
geom_smooth(method='lm')
解决方案
我已经更新了 'ggpmisc' 以简化此操作。版本 0.3.4 现在正在向 CRAN 发送,源代码包已上线,二进制文件应在几天内构建。
library(ggpmisc) # version >= 0.3.4 !!
ggplot(mtcars, aes(x = wt, y = mpg, group = cyl)) +
geom_smooth(method="lm")+
geom_point()+
stat_poly_eq(formula = y ~ x,
aes(label = paste(..eq.label.., ..rr.label.., ..p.value.label.., sep = "*`,`~")),
parse = TRUE,
label.x.npc = "right",
vstep = 0.05) # sets vertical spacing
推荐阅读
- amazon-web-services - 无法连接到 AWS EC2 实例
- spring - 运行 jhipster 项目时出现奇怪的连接错误
- php - $_POST['variable'] 不起作用
- shell - 终端 - 结合 find 和 xargs - 在右侧找到
- c# - 使用特殊字符更新 DriveItem 会返回错误
- ios - ARKit 2.0触发图像下的“隐藏”平面节点
- ios - iOS 构建问题 App Store prefs:root=
- spring - Spring 框架的版本 < 5.05 是否容易受到 CVE-2018-1258 的影响
- android - 使用 RxAndroid 从列表中删除对象
- python - 当事件发生在日期和时间更改时,使用scrapy刮掉报价