【问题标题】:Display regression slopes for multiple subsets in ggplot2 (facet_grid)在 ggplot2 (facet_grid) 中显示多个子集的回归斜率
【发布时间】:2015-03-25 14:18:06
【问题描述】:

致我的程序员伙伴们,

我一直在网上搜索这个问题的答案,我完全被难住了。

很简单,我试图在我的 ggplot2 图上显示斜率 (y=mx+b) 和 R 平方值(使用 RStudio)。

在我的实验中,我测量了细菌对不同培养基成分(食物来源)的反应。因此,在一个图中,我有许多面板(或子集),每个面板都有不同的 R^2 和斜率。在这个例子中,我有 6 个不同的子集,它们都有完全相同的轴。

为此,我创建了一个“MasterTable”

MasterTable <- inner_join(LongRFU, LongOD, by= c("Time.h", "Well", "Conc.nM", "Assay"))

我的所有原始值都采用长表格式(子集称为 Assay)。

然后我创建了第二个表,它只显示 6 个子集的 R 平方值:

确定每个子集的相关性

Correlation <- ddply(MasterTable, .(Assay), summarise, cor = round(cor(maxRFU, Conc.nM), 3))
Correlation$Rsquared <- (Correlation$cor)^2
Correlation$Rsquared <- round(Correlation$Rsquared,3)

使用这个命令,我已经设法在我的图的所有子集中显示 R^2(下面的 ggplot 命令)。

计算回归的斜率和截距:

slope <- dlply(MasterTable, .(Assay), lm, formula = (maxRFU ~ Conc.nM))
m <- lm(MasterTable$Conc.nM ~ MasterTable$maxRFU)
a <- signif(coef(m)[1], digits = 2)
b <- signif(coef(m)[2], digits = 2)
textlab <- paste("y = ",b,"x + ",a, sep="")
print(textlab[1])

创建 ggplot

ggplot(data=MasterTable, aes(x=Conc.nM, y=maxRFU)) + 
    geom_point(shape = 21, size = 2, colour = "black", fill = "#606060") + 
    geom_smooth(method = "lm", colour = "#001170", se=TRUE) + 
    geom_text(data=Correlation, 
            aes(label=paste("R^2=", " ", Rsquared, sep="")), x=200, y=550) + 
    annotate("text", x = 200, y = 500, label = textlab, color="black", 
              size = 5, parse=FALSE) + 
    geom_errorbar(aes(ymin=maxRFU-sdRFU, ymax=maxRFU+sdRFU), width=.05, 
                  colour="#4b4b4b", linetype = "solid", size = 0.1) +
    theme(panel.background = element_rect(fill="white", 
          linetype = "solid", colour = "black"), 
          legend.key = element_rect(fill = "white"), 
          panel.grid.minor = element_blank(), panel.grid.major = element_blank()) + 
    facet_grid(. ~ Assay) + 
    labs(title="Calibration curves", y="Max RFU", 
         x="As(III) concentration (nM)")

StackOverflow 不允许我发布图片...所以我已将其上传到我的盒子帐户:

Calibration curves

现在你明白我的问题了吗?

所有子集都显示完全相同的斜率。我似乎无法找到解决此问题的方法,非常感谢您在此问题上的帮助。

我还有一个额外的问题。这是一个愚蠢的问题,但如果有人知道如何解决它,那就太棒了。我真的很想在下标中显示 R^2 值,就像在这个链接中显示的那样: Subscript in ggplot

哦,最后一个额外问题:我似乎无法在错误栏上设置“上限”...

再次感谢您对此事的所有帮助,

马蒂

【问题讨论】:

  • 如果没有看到您用于制作绘图的每个数据框的样本,我无法确定(您通常应该在将来发布此类样本,以便我们可以运行您的代码并重现问题您正在尝试解决),但看起来您正在使用 annotate 将回归方程文本添加到每个图中。相反,请使用geom_text。只要textlab 数据框有Assay 的列,geom_text 就会将回归方程放入与textlabAssay 的每个值匹配的每个面板中。
  • 为了完整起见,我应该在我之前的评论中提到包含文本标签的列的名称需要进入geom_text 中的aes(就像您对@987654337 的其他调用一样@)。
  • 谢谢eipi!你想通了。如何让您的帖子成为答案?

标签: r ggplot2 regression facet


【解决方案1】:

eipi 已经找到了答案。我对我的代码做了一些修改,它现在可以工作了。

Intercept <- ddply(MasterTable, .(Assay),function(x) coefficients(lm(maxRFU~Conc.nM,x)))
names (Intercept) <- c("Assay", "Intercept", "Slope")
Intercept$Intercept <- round(Intercept$Intercept,0)
Intercept$Slope <- round(Intercept$Slope,3)

ddply 行添加了一个如下所示的表格:

                Assay   Intercept    Slope
1               B-GMM    601.2766  0.3758356
2       B-GMM + As(V)   1271.3436 -0.5405553
3 B-GMM + As(V) + PO4    699.9420  0.8970737
4         B-GMM + PO4    720.5684  1.0486098
5                 GMM    749.9787  1.9294352
6         GMM + As(V)    768.1253  1.4962517

然后,在 ggplot 中,我添加了以下行:

geom_text(data=Intercept, aes(label=paste("y = ",Slope,"x + ",Intercept, sep="")), x=200, y=500)

就这么简单。

再次感谢!

【讨论】:

  • 很高兴你能够按照你想要的方式进行剧情。您应该继续接受您的答案(尽管您可能需要等待一两天才能让网站让您接受您自己问题的答案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
相关资源
最近更新 更多