ggplot:添加回归线方程和带刻面的R2

ggplot:添加回归线方程和带刻面的R2,r,ggplot2,R,Ggplot2,我已经用ggplot创建了一个分面散点图,但我正在努力将回归线方程添加到每个分面。没有刻面的简单情况已经得到解答,但这种方法不会扩展到刻面图 有没有办法以一种干净的方式完成这项工作?这是否符合您的要求 library(ggplot2); library(gridExtra) ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point() + geom_smooth(method="lm") + facet_wrap(~ Spec

我已经用
ggplot
创建了一个分面散点图,但我正在努力将回归线方程添加到每个分面。没有刻面的简单情况已经得到解答,但这种方法不会扩展到刻面图


有没有办法以一种干净的方式完成这项工作?

这是否符合您的要求

library(ggplot2); library(gridExtra)
ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point() +
  geom_smooth(method="lm") +
  facet_wrap(~ Species)

grid.newpage()
vpa_ <- viewport(width = 1, height = 1)
print(p, vp = vpa_)
grid.text("y ~ mx + b", x=0.3, y=0.8)
grid.text("y ~ mx + b", x=0.5, y=0.8)
grid.text("y ~ mx + b", x=0.8, y=0.8)
库(ggplot2);图书馆(gridExtra)
ggplot(鸢尾,aes(萼片长度,萼片宽度))+
几何点()+
几何光滑(方法=“lm”)+
面_包装(~种)
grid.newpage()

这里是一个从这个开始的例子

require(ggplot2)
需要(plyr)

df使用
gridExtra
您可以像这样排列绘图

library(ggplot2)

library(ggplot2)
iris$x = iris$Sepal.Length 
iris$y = iris$Sepal.Width
xx <- range(iris$x)
yy <- range(iris$y)

ll <- by(iris,iris$Species,function(df){
  x.eq <- max(xx)-mean(xx)/2
  y.eq <- max(yy)*0.95
  p <- ggplot(df, aes(x, y)) +
    geom_point() +
    geom_smooth(method="lm") +
    annotate(x=x.eq, y =y.eq ,  geom='text',
              label = lm_eqn(df), size=5,parse=TRUE) +
    xlim(xx[1],xx[2])+ylim(yy[1],yy[2])
})

library(gridExtra)
do.call(grid.arrange,ll)

库(ggplot2)
图书馆(GG2)
鸢尾$x=鸢尾$萼片长度
虹膜$y=虹膜$萼片宽度

xx谢谢,但我需要更重要的等式。我想你可以将向量/列表等传递给
注释
,这样你可能是对的。但是,在您放置的链接中,答案并没有将向量传递给
annotate
。你知道怎么做吗?嗯,我想那没用,是吗。用gridextra解决方案编辑上面的答案,我经常使用gridextra解决方案提供一些可复制的数据,并提供您尝试过的内容…建议的重复点指向我在问题中已经提供的链接。关于该链接的一条评论(没有得到回答)也提出了同样的问题,即如何在平面图上添加等式。技巧似乎是为标签传递
向量
/
数据.frame
。我不相信这是重复的。@agstudy,我试图使用
annotate
而不是
geom_text
,但我无法将
eq
数据帧或列
eq$V1
传递给它。你能帮我一下吗?@JT85,不管上面怎么说,你的回答对我目前的问题非常有效,这就是为什么我已经接受了它。不过我还是想用
注释
,没问题。然而,我不认为
annotate
facet\u grid
一起工作。agstudy的方法完全不同。但我可能错了。@JT85这是一项伟大的工作,但它留下了一个主要缺陷,IMHO。该线是使用与实际方程式不同的代码绘制的。对于一个简单的线性最小二乘法,这很重要。但是,如果我想使用nice
多项式拟合呢。我必须重新创建
,然后假设我已正确设置了所有参数/假设。难道没有一个简单的
show.eqn
标志或类似的东西吗?若否,原因为何?这似乎是回归拟合的基础!(顺便说一句,我知道这不是你的代码。只是问问这里的普通人群…)至少从R3.5开始,
format()
不再丢弃
names
属性
coef(m)[1]
lm_eqn(df)
函数返回
“italic(y)==c(`(Intercept)`=\'-0.83\”)。
而不是像
“italic(y)”这样的东西=\“-0.83\”..
。这可以通过丢弃带有
as.numeric(coef(m)[1])
等的名称属性来纠正。谢谢<代码>网格。排列
似乎更像
facet\u wrap
而不是
facet\u grid
。是这样吗?如果是这样,我想让
facet\u网格
这类解决方案发挥作用。
df$group <- c(rep(1:2,50))
eq <- ddply(df,.(group),lm_eqn)
p <- ggplot(data = df, aes(x = x, y = y)) +
            geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
            geom_point()
p1 = p + geom_text(data=eq,aes(x = 25, y = 300,label=V1), parse = TRUE, inherit.aes=FALSE) + facet_grid(group~.)
p1 
library(ggplot2)

library(ggplot2)
iris$x = iris$Sepal.Length 
iris$y = iris$Sepal.Width
xx <- range(iris$x)
yy <- range(iris$y)

ll <- by(iris,iris$Species,function(df){
  x.eq <- max(xx)-mean(xx)/2
  y.eq <- max(yy)*0.95
  p <- ggplot(df, aes(x, y)) +
    geom_point() +
    geom_smooth(method="lm") +
    annotate(x=x.eq, y =y.eq ,  geom='text',
              label = lm_eqn(df), size=5,parse=TRUE) +
    xlim(xx[1],xx[2])+ylim(yy[1],yy[2])
})

library(gridExtra)
do.call(grid.arrange,ll)