在ggplot中拟合二次曲线

use*_*020 13 r quadratic ggplot2

这是我的样本数据.我想在一个情节中绘制两个y1y2反对x1的情节.这就是我做的:

library(ISLR)
library(ggplot2)

y1<-scale(Auto$horsepower,scale = T,center=T)
y2<-scale(Auto$weight,scale = T,center=T)
x1<-Auto$mpg
df<-data.frame(y1,y2,x1)

p<-ggplot(df,aes(x=x1)) + 
   geom_point(aes(y = y1), shape = 16) +
   geom_point(aes(y = y2), shape = 2) 
Run Code Online (Sandbox Code Playgroud)

我想为y1和y2插入一条二次线对x.我这样做了:

p + stat_smooth(method = "lm", formula = y ~ x + I(x^2), size = 1)
Run Code Online (Sandbox Code Playgroud)

它引发了一个错误:

Warning message:
Computation failed in `stat_smooth()`:
variable lengths differ (found for 'x')  
Run Code Online (Sandbox Code Playgroud)

除此之外,该stat_smooth命令只能将一个二次线,而我需要两个二次线都y1y2.

我是如何在R中实现这一目标的?

谢谢

Did*_*rts 24

您应该添加两个stat_smooth()调用并添加aes()以显示y要使用的内容.

ggplot(df,aes(x=x1)) + 
      geom_point(aes(y = y1), shape = 16) +
      geom_point(aes(y = y2), shape = 2) +
      stat_smooth(aes(y = y1),method = "lm", formula = y ~ x + I(x^2), size = 1) +
      stat_smooth(aes(y = y2),method = "lm", formula = y ~ x + I(x^2), size = 1, color = "red")
Run Code Online (Sandbox Code Playgroud)

或者制作长格式表,然后你只需要调用一次stat_smooth()geom_point().

library(tidyr)
df_long <- df %>% gather(variable, value, y1:y2)

ggplot(df_long, aes(x1, value, color = variable)) +
      geom_point() +
      stat_smooth(method = "lm", formula = y ~ x + I(x^2), size = 1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述