使用 dplyr 包中的函数将等式添加到带有 facets 的 qqplot

Using functions from dplyr package to add equation to qqplot with facets

我正在尝试使用回归方程和分组数据的 r2 生成散点图。

我可以做一个,但是对于分组数据,我在以一种可以自动提取并添加为注释的方式计算所有组的方程式和 r2 时遇到了麻烦。
我相信我已经很接近了,只是犯了一些愚蠢的错误,但似乎无法识别。

1 - 首先,我创建了一个函数,用于创建模型和包含结果的字符串。

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

我走到这一步,但在第 2 步,一切都崩溃了:

2 - 现在我必须对分组数据使用该函数。

This post suggests the use of ddply (from plyr package). I tried to replace that with something equivalent from the dplyr package, as suggested here.

 labelsP3 <- iris %>% group_by(Species) %>% do(eqlabels(.))

但是,这会导致警告消息(然后它不会绘制...): 警告信息:

Error: Results are not data frames at positions: 1, 2, 3

按照建议here,我试过了:

labelsP3 <- iris %>% group_by(Species) %>% do(with(eqlabels(iris)))

但这会导致错误:

Error in eval(substitute(expr), data, enclos = parent.frame()) : invalid 'envir' argument of type 'character'

剧情应该是这样的,但是卡在这一步了

plot3 <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point(colour = "grey60") +
  facet_grid(Species ~ .) +
  stat_smooth(method = lm) +
  annotate("text", label = labelsP3, parse = TRUE)

谢谢。

好的,我们再试一次:

执行以下操作:labelsP3<-ddply(iris,.(Species),eqlabels) 这将得到您的方程式:

    Species                                                                           
    1     setosa  italic(y) == "2.64" + "0.69" * italic(x) * "," 
~italic(r)^2 ~ "=" ~ "0.55"
    2 versicolor italic(y) == "3.54" + "0.865" * italic(x) * "," ~ 
~italic(r)^2 ~ "=" ~ "0.28"
    3  virginica italic(y) == "3.91" + "0.902" * italic(x) * "," ~ 
~italic(r)^2 ~ "=" ~ "0.21"

现在你有了方程式,你应该可以很容易地把它们画在你的图表上

然后您可以使用它在您的绘图上绘制方程式

geom_text(data=labels3, aes(label=V1, x=7, y=2), parse=TRUE)

编辑:第三次很有魅力

所以经过大量的试验和错误后,我让它工作了,我仍然收到警告,但至少这是朝着正确方向迈出的一步。正如我之前怀疑的那样,你必须使用 as.data.frame,像这样:labelsP3 <- iris %>% group_by(Species) %>% do(as.data.frame(eqlabels(.)))

你得到以下输出:

     Source: local data frame [3 x 2]
        Groups: Species [3]

             Species                                                                   eqlabels(.)
              (fctr)                                                                         (chr)
        1     setosa  italic(y) == "2.64" + "0.69" * italic(x) * "," ~ 
~italic(r)^2 ~ "=" ~ "0.55"
        2 versicolor italic(y) == "3.54" + "0.865" * italic(x) * "," ~ 
~italic(r)^2 ~ "=" ~ "0.28"
        3  virginica italic(y) 

    == "3.91" + "0.902" * italic(x) * "," ~ ~italic(r)^2 ~ "=" ~ "0.21"

对你有帮助吗?

更新:

对于绘图部分,您可以按照以下方式进行:

    plot3 <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point(colour = "grey60") +
      facet_grid(Species ~ .) +
      stat_smooth(method = lm) + 
      geom_text(data=labelsP3, aes(label=`eqlabels(.)`, x=7, y=2), parse=TRUE)

x 和 y 是 geom_text 用于在图表上放置标签。

或者这看起来更好一点:

 plot3 + geom_text(data=labelsP3, aes(label=`eqlabels(.)`, vjust = -1, +
hjust=-0.5,x=4, y=0), parse=TRUE)