'How to plot a polynomial line and equation using ggplot and then combine them into one plot'
'How to plot a polynomial line and equation using ggplot and then combine them into one plot'
我试图在一个图上比较和对比具有相似 x 轴的四种关系之间的差异。
我似乎可以绘制回归线,但不知道如何绘制等式 and/or 将所有四个图合并为一个。
这是我的代码的基础:抱歉,如果它非常基础或笨拙,我才刚刚开始。
library(ggplot2)
library(cowplot)
p1 <- ggplot(NganokeData, aes(x=Depth,y=LCU1)) + geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)', title = 'Density Regression of Lake Nganoke Core 1') +
ylim(1,2)
p2 <- ggplot(NganokeData, aes(x=Depth,y=LCU2)) + geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)', title = 'Density Regression of Lake Nganoke Core 2') +
ylim(1,2)
p3 <- ggplot(NganokeData, aes(x=Depth,y=LCU3)) + geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)', title = 'Density Regression of Lake Nganoke Core 3') +
ylim(1,2)
p4 <- ggplot(NganokeData, aes(x=Depth,y=LCU4)) + geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)', title = 'Density Regression of Lake Nganoke Core 4') +
ylim(1,2)
p3 + stat_smooth(method = "lm", formula = y ~ poly(x, 3), size = 1) #Adds polynomial regression
Picture of my code
您似乎在列名中有感兴趣的变量(LCU1、LCU2、LCU3、LCU4)。您可以使用 tidyr 包中的 gather 来重塑数据框:
library(tidyr)
long_data <- gather(NganokeData, key = "core", value = "density",
LCU1, LCU2, LCU3, LCU4)
然后使用 ggplot2 包中的 facet_grid 将您的图划分为您要查找的四个方面。
p <- ggplot(long_data, aes(x=Depth,y=density)) +
geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)',
title = 'Density Regression of Lake Nganoke Cores') +
ylim(1,2) +
facet_grid(rows = vars(core)) #can also use cols instead
p + stat_smooth(method = "lm", formula = y ~ poly(x, 3), size = 1)
你的代码很棒。但作为初学者,我强烈建议花几分钟时间阅读并学习使用 tidyr 包,因为 ggplot2 是建立在 tidy 数据的概念之上的,如果你能操纵在尝试绘制之前将数据框转换为您需要的格式。
https://tidyr.tidyverse.org/index.html
编辑:
要添加详细说明回归方程的注释,我从 Jodie Burchell 的博客 post 中找到了代码:
不过,首先,不可能像您拥有的那样使用公式中的 poly 函数收集可显示的回归方程。正交多项式的优点是它们避免了共线性,但缺点是您不再有一个易于解释的回归方程,其中 x 和 x 的平方和 x 的立方作为回归变量。
所以我们必须将 lm 拟合公式更改为
y ~ poly(x, 3, raw = TRUE)
这将拟合原始多项式并为您提供您正在寻找的回归方程。
您将不得不更改 x 和 y 位置值以确定在图表上放置注释的位置,因为我没有您的数据,但这是您需要的自定义函数:
equation = function(x) {
lm_coef <- list(a = round(coef(x)[1], digits = 2),
b = round(coef(x)[2], digits = 2),
c = round(coef(x)[3], digits = 2),
d = round(coef(x)[4], digits = 2),
r2 = round(summary(x)$r.squared, digits = 2));
lm_eq <- substitute(italic(y) == a + b %.% italic(x) + c %.% italic(x)^2 + d %.% italic(x)^3*","~~italic(R)^2~"="~r2,lm_coef)
as.character(as.expression(lm_eq));
}
然后只需将注释添加到绘图中,根据需要调整 x 和 y 参数,即可设置:
p +
stat_smooth(method = "lm", formula = y ~ poly(x, 3, raw = TRUE), size = 1) +
annotate("text", x = 1, y = 10, label = equation(fit), parse = TRUE)
我试图在一个图上比较和对比具有相似 x 轴的四种关系之间的差异。
我似乎可以绘制回归线,但不知道如何绘制等式 and/or 将所有四个图合并为一个。
这是我的代码的基础:抱歉,如果它非常基础或笨拙,我才刚刚开始。
library(ggplot2)
library(cowplot)
p1 <- ggplot(NganokeData, aes(x=Depth,y=LCU1)) + geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)', title = 'Density Regression of Lake Nganoke Core 1') +
ylim(1,2)
p2 <- ggplot(NganokeData, aes(x=Depth,y=LCU2)) + geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)', title = 'Density Regression of Lake Nganoke Core 2') +
ylim(1,2)
p3 <- ggplot(NganokeData, aes(x=Depth,y=LCU3)) + geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)', title = 'Density Regression of Lake Nganoke Core 3') +
ylim(1,2)
p4 <- ggplot(NganokeData, aes(x=Depth,y=LCU4)) + geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)', title = 'Density Regression of Lake Nganoke Core 4') +
ylim(1,2)
p3 + stat_smooth(method = "lm", formula = y ~ poly(x, 3), size = 1) #Adds polynomial regression
Picture of my code
您似乎在列名中有感兴趣的变量(LCU1、LCU2、LCU3、LCU4)。您可以使用 tidyr 包中的 gather 来重塑数据框:
library(tidyr)
long_data <- gather(NganokeData, key = "core", value = "density",
LCU1, LCU2, LCU3, LCU4)
然后使用 ggplot2 包中的 facet_grid 将您的图划分为您要查找的四个方面。
p <- ggplot(long_data, aes(x=Depth,y=density)) +
geom_point() +
labs(x ='Depths (cm)', y ='Density (Hu)',
title = 'Density Regression of Lake Nganoke Cores') +
ylim(1,2) +
facet_grid(rows = vars(core)) #can also use cols instead
p + stat_smooth(method = "lm", formula = y ~ poly(x, 3), size = 1)
你的代码很棒。但作为初学者,我强烈建议花几分钟时间阅读并学习使用 tidyr 包,因为 ggplot2 是建立在 tidy 数据的概念之上的,如果你能操纵在尝试绘制之前将数据框转换为您需要的格式。
https://tidyr.tidyverse.org/index.html
编辑:
要添加详细说明回归方程的注释,我从 Jodie Burchell 的博客 post 中找到了代码:
不过,首先,不可能像您拥有的那样使用公式中的 poly 函数收集可显示的回归方程。正交多项式的优点是它们避免了共线性,但缺点是您不再有一个易于解释的回归方程,其中 x 和 x 的平方和 x 的立方作为回归变量。
所以我们必须将 lm 拟合公式更改为
y ~ poly(x, 3, raw = TRUE)
这将拟合原始多项式并为您提供您正在寻找的回归方程。
您将不得不更改 x 和 y 位置值以确定在图表上放置注释的位置,因为我没有您的数据,但这是您需要的自定义函数:
equation = function(x) {
lm_coef <- list(a = round(coef(x)[1], digits = 2),
b = round(coef(x)[2], digits = 2),
c = round(coef(x)[3], digits = 2),
d = round(coef(x)[4], digits = 2),
r2 = round(summary(x)$r.squared, digits = 2));
lm_eq <- substitute(italic(y) == a + b %.% italic(x) + c %.% italic(x)^2 + d %.% italic(x)^3*","~~italic(R)^2~"="~r2,lm_coef)
as.character(as.expression(lm_eq));
}
然后只需将注释添加到绘图中,根据需要调整 x 和 y 参数,即可设置:
p +
stat_smooth(method = "lm", formula = y ~ poly(x, 3, raw = TRUE), size = 1) +
annotate("text", x = 1, y = 10, label = equation(fit), parse = TRUE)