【问题标题】:ggplot: Adding Regression Line Equation and R2 with Facet [duplicate]ggplot:使用 Facet 添加回归线方程和 R2 [重复]
【发布时间】:2013-11-11 01:34:44
【问题描述】:

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

任何想法如何以干净的方式完成此任务?

【问题讨论】:

  • 最好提供一些可重复的数据并提供您尝试过的内容...
  • 建议的重复项指向我已经在我的问题中提供的链接。该链接上的一个未回答的 cmets 也提出了相同的问题,即如何在多面图上添加方程。诀窍似乎是为标签传递vector/data.frame。我不相信这是重复的。

标签: r ggplot2


【解决方案1】:

这是你想要的吗?

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)

【讨论】:

  • 谢谢,但更重要的是我需要方程式。
  • 我认为你可以传递一个向量/列表/等。到annotate,像这样stackoverflow.com/questions/11889625/…
  • 你可能是对的。在您放置的链接中,答案并未将向量传递给annotate。你知道怎么做吗?
  • 嗯,我猜这行不通。使用我经常使用的 gridextra 解决方案编辑上面的答案
【解决方案2】:

这是一个从answer开始的例子

require(ggplot2)
require(plyr)

df <- data.frame(x = c(1:100))
df$y <- 2 + 3 * df$x + rnorm(100, sd = 40)


lm_eqn = function(df){
    m = lm(y ~ x, df);
    eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, 
         list(a = format(coef(m)[1], digits = 2), 
              b = format(coef(m)[2], digits = 2), 
             r2 = format(summary(m)$r.squared, digits = 3)))
    as.character(as.expression(eq));                 
}

创建两个你想要分面的组

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 

【讨论】:

  • @agstudy,我正在尝试使用annotate 而不是geom_text,但我无法将eq 数据框或eq$V1 列传递给它。你能帮我解决这个问题吗?
  • @JT85,无论上述评论如何,您的回答都非常适合我当前的问题,这就是我已经接受它的原因。不过我还是想改用annotate
  • 没问题。但是我不认为annotatefacet_grid 一样。 agstudy 的方法完全不同。但我可能是错的。
  • @JT85 这是一个很好的解决方法,但它留下了一个主要缺陷,恕我直言。该线的绘制使用与实际方程式不同的代码。对于一个简单的线性最小二乘,很重要。但是,例如,如果我想使用漂亮的loess 多项式拟合怎么办。我必须重新创建loess,然后假设我已经正确设置了所有参数/假设。没有简单的show.eqn 标志或类似的东西吗?如果不是,为什么?这似乎对回归拟合非常重要! (顺便说一句,我知道这不是你的代码。只是在这里问一般人群......)
  • 至少从 R 3.5 开始,format() 不再丢弃 coef(m)[1]names 属性,并且 lm_eqn(df) 函数返回 "italic(y) == c(`(Intercept)` = \"-0.83\")… 而不是像 "italic(y) == \"-0.83\" … 这样的东西。这可以通过使用as.numeric(coef(m)[1]) 等丢弃名称属性来纠正。
【解决方案3】:

使用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)

【讨论】:

  • 谢谢。 grid.arrange 似乎更像facet_wrap 而不是facet_grid。那正确吗?如果是这样,我希望 facet_grid 之类的解决方案能够正常工作。
猜你喜欢
  • 2018-06-19
  • 2020-11-10
  • 2018-08-31
  • 2015-07-06
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2021-03-25
相关资源
最近更新 更多