将 SMA 回归线(smatr 包)绘制到 ggplot 中

Posted

技术标签:

【中文标题】将 SMA 回归线(smatr 包)绘制到 ggplot 中【英文标题】:Plotting SMA regressions lines (smatr package) into ggplot 【发布时间】:2020-03-14 10:08:46 【问题描述】:

我将非常感谢有关如何将标准化主轴 (SMA) 回归线绘制成多面 ggplot 的建议。我使用了以下代码:

运行 SMA 分析并使用我要绘制的 SMA reg 线系数(截距和斜率)创建一个数据框

smaReg = sma(Y ~ X * Type, data = ExampleData)
summary(smaReg)
smaSummary <- data.frame(Type = 1:6,coef(smaReg))

ggplot 代码使用 geom_abline 绘制 SMA 回归

ModFit <- ggplot(ExampleData, aes(y = Y, x = X, color = Level)) +
  geom_point() +
  theme_bw() +
  theme_classic() + 
  facet_wrap(~ Type, nrow = 2, ncol = 3) +
  theme(strip.background = element_blank(), strip.text = element_text(face = 'bold', size = 12)) +
  annotate("segment", x = -Inf, xend = Inf, y = -Inf, yend = -Inf, color = 'black', size = 1) +
  annotate("segment", x = -Inf, xend = -Inf, y = -Inf, yend = Inf, color = 'black', size = 1) +
  scale_x_continuous(breaks = seq(from = 0, to = 60, by = 20)) + 
  scale_y_continuous(breaks = seq(from = 0, to = 120, by = 20)) +
  geom_abline(data = smaSummary, aes(intercept = elevation, slope = slope)) +
  labs(x = expression(paste("Predicted (",mu,"mol m"^-2,"s"^-1,")")), y = expression(paste("Observed (",mu,"mol m"^-2,"s"^-1,")"))) +

ModFit

此代码还有两个问题需要解决,但我的初学者编码技能还不足以成功解决这些问题:

    我使用 annotate() 和 scale_x_continuous 在所有分面图上绘制相同的轴和刻度,但是,此解决方案不会绘制 X 轴刻度,而且我还没有找到一种方法来做到这一点当我做出改变时出错了。

    当我运行此绘图代码时,我收到以下错误消息:

wrap_dims(n, params$nrow, params$ncol) 中的错误: nrow * ncol >= n 不正确

在尝试解决此错误的不同方法时,我注意到如果我将 labs() 层更改为如下所示的非常简化的版本:

labs(x = expression(X), y = expression(Y), color = "Level") +

此更改会生成多面图,但每个图上都有所有 SMA 回归。我不知道为什么更改 labs() 层可以生成绘图!关于如何只为每个图绘制相应的 SMA reg 线,同时添加我需要的详细轴标签而不会出现其他问题,我已经没有想法(和谷歌搜索)了。

Faceted plot with simplified labels and all SMA reg lines on each plot

非常感谢您提供有关如何解决这两个剩余问题的任何建议!

【问题讨论】:

您能否包含一些示例数据?使用dput(head(x)) 函数包含示例数据将有助于其他人回答您的问题。 这里有多个问题。我会从分面图/轴中分离出轴标题问题——单独的问题可能有助于社区阅读和回答。 您好 Ravic,在发布我的问题之前,我尝试上传数据文件,但找不到方法。有没有办法做到这一点,我错过了? 关于分离这两个问题,我以为我已经通过编号来做到这一点。这只是我第三次发问题,有没有特别的方法可以发两个相关的问题? 这里是一个链接,描述了如何构建一个好的可重现问题,包括如何包含示例数据:***.com/questions/5963269/… 【参考方案1】:

(更新:添加了希腊数学符号)

让我们处理标签,在您的示例中这些标签非常棘手。我在这里使用 iris 数据集作为示例,但使用了您的轴标题。

关键是使用bquote() 来准备数学、动态变量和其他一切。

这里有更多详细信息:https://trinkerrstuff.wordpress.com/2018/03/15/2246/ 然后:Evaluate expression given as a string
library(tidyverse)
mu_val <- 5.1
bq_x <- bquote("Predicted (" ~ mu ~ "=" ~ .(mu_val) ~ " mol " ~ m^-2 ~ s^-1 ~ ")")
bq_y <- bquote("Observed (" ~ mu ~ "=" ~ .(mu_val) ~ "mol m" ~ m^-2 ~ s^-1 ~ ")")

iris %>%
  ggplot(aes(Sepal.Length, Petal.Length)) +
  geom_point() +
  labs(title = "test", x = bq_x, y = bq_y)

由reprex package (v0.3.0) 于 2019 年 11 月 19 日创建

@ravic_ 感谢您的建议,我现在可以使用以下修改后的代码生成带有正确标签的多面图:

我更新了我的 ggplot 代码:

bq_x <- bquote("Predicted (" ~mu~"mol" ~ m^-2 ~ s^-1 ~ ")")
bq_y <- bquote("Observed (" ~mu~"mol" ~ m^-2 ~ s^-1 ~ ")")

# 1a. Plots by PFTs
ModFit <- ggplot(ExampleData, aes(y = Y, x = X, color = Level)) +
  geom_point() +
  theme_bw() +
  theme_classic() + 
  facet_wrap(~ Type, nrow = 2, ncol = 3) +
  # customise facet labels
  theme(strip.background = element_blank(), strip.text = element_text(face = 'bold', size = 12)) +
  annotate("segment", x = -Inf, xend = Inf, y = -Inf, yend = -Inf, color = 'black', size = 1) +
  annotate("segment", x = -Inf, xend = -Inf, y = -Inf, yend = Inf, color = 'black', size = 1) +
  scale_x_continuous(breaks = seq(from = 0, to = 60, by = 20)) + 
  scale_y_continuous(breaks = seq(from = 0, to = 120, by = 20)) +
  labs(x = bq_x, y = bq_y) +
  geom_abline(data = smaSummary, aes(intercept = elevation, slope = slope))

现在剩下的两个问题是: 1. 在所有分面图上添加带有刻度的 Y 和 X 轴线 2. 将对应的单个 SMA reg 线添加到每个 plot

再次感谢您的所有帮助@ravic_!

【讨论】:

非常感谢 ravic,但为什么 mu(micro 的符号/希腊字母)声明为 5.1?我已经研究了使用 bquote() 使用希腊字母的不同方法,例如*mu~,但还没有找到可行的方法。 @Dodo,抱歉,您以为您正在尝试包含动态值。我用希腊字符和动态值更新了条目。事实证明,有了bquote(),你就不需要像我们在其他地方写 Latex 时那样使用技巧了。 非常感谢编码解决方案和链接! “thinkerrstuff,,” 链接特别有用,因为它非常清楚地解释了语法。我已将代码更新为:

以上是关于将 SMA 回归线(smatr 包)绘制到 ggplot 中的主要内容,如果未能解决你的问题,请参考以下文章

R语言可视化包ggplot2绘制平滑曲线回归线实战:geom_smooth() 函数

为嵌套列表中的每条记录绘制回归线

R语言可视化包ggplot2绘制线性回归模型曲线实战( Linear Regression Line)

绘制分位数回归线

找到并绘制回归平面到一组点

ROCR 包 - 逻辑回归以外的分类算法