将 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()
来准备数学、动态变量和其他一切。
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() 函数