“如何使用ggplot绘制多项式线和方程,然后将它们组合成一个图”

时间:2019-08-04 07:49:36

标签: r ggplot2 regression polynomials

我试图在一个图上比较和对比x轴相似的四种关系之间的差异。

我似乎可以绘制回归线,但不知道如何绘制方程式和/或将所有四个图合并到一个图上。

这是我代码的基本基础:很抱歉,如果它非常基本或笨拙,我才刚刚开始。

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

1 个答案:

答案 0 :(得分:0)

看起来您在列名称中有一个感兴趣的变量(LCU1,LCU2,LCU3,LCU4)。您可以使用tidyr包中的collect来重塑数据框:

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是基于整洁数据的概念构建的,如果您可以操作可视化工具,将会发现使可视化变得容易得多。数据框,然后将其绘制成所需的格式。

https://tidyr.tidyverse.org/index.html

编辑:

要添加详细描述回归方程的注释,我从Jodie Burchell的博客文章中找到了代码:

http://t-redactyl.io/blog/2016/05/creating-plots-in-r-using-ggplot2-part-11-linear-regression-plots.html

但是,首先,您将无法使用公式中的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)