R ggplot2-在同一绘图上绘制多个模型

R ggplot2-在同一绘图上绘制多个模型,r,ggplot2,R,Ggplot2,我有一个线性和非线性模型列表,这些模型来自不同的数据集,测量相同的两个变量x和y,我想使用stat\u smooth在同一个图上绘制。这是为了能够轻松比较数据集之间x和y之间的关系形状 我想找出最有效的方法。现在我正在考虑创建一个空的ggplot对象,然后使用某种循环或lappy顺序添加到该对象,但事实证明这比我想象的更困难。当然,简单地将模型提供给ggplot是最容易的,但据我所知,这是不可能的。有什么想法吗 下面是一个简单的示例数据集,仅使用两个模型,一个是线性模型,一个是指数模型: df1

我有一个线性和非线性模型列表,这些模型来自不同的数据集,测量相同的两个变量
x
y
,我想使用
stat\u smooth
在同一个图上绘制。这是为了能够轻松比较数据集之间
x
y
之间的关系形状

我想找出最有效的方法。现在我正在考虑创建一个空的ggplot对象,然后使用某种循环或
lappy
顺序添加到该对象,但事实证明这比我想象的更困难。当然,简单地将模型提供给
ggplot
是最容易的,但据我所知,这是不可能的。有什么想法吗

下面是一个简单的示例数据集,仅使用两个模型,一个是线性模型,一个是指数模型:

df1=data.frame(x=rnorm(10),y=rnorm(10))
df2=data.frame(x=rnorm(15),y=rnorm(15))

df.list=list(lm(y~x,df1),nls(y~exp(a+b*x),start=list(a=1,b=1),df2))
和两个单独的示例图:

ggplot(df1,aes(x,y))+stat_smooth(method=lm,se=F)
ggplot(df2,aes(x,y))+stat_smooth(method=nls,formula=y~exp(a+b*x),start=list(a=1,b=1),se=F)

编辑:请注意,在发布此答案后,OP更改了问题

将数据合并到一个数据框中,新列指示模型,然后使用
ggplot
区分模型:

df1=data.frame(x=rnorm(10),y=rnorm(10))
df2=data.frame(x=rnorm(10),y=rnorm(10))

df1$model <- "A"
df2$model <- "B"

dfc <- rbind(df1, df2)

library(ggplot2)
ggplot(dfc, aes(x, y, group=model)) + geom_point() + stat_smooth(aes(col=model))
df1=data.frame(x=rnorm(10),y=rnorm(10))
df2=数据帧(x=rnorm(10),y=rnorm(10))

df1$model我认为这里的答案是得到一个X和Y的共同范围,你想把这个计算一遍,然后从那里开始。您可以使用predict从每个模型中提取一条曲线,并使用l_ply将层添加到ggplot

d

f1=data.frame(x=rnorm(10),y=rnorm(10))
df2=数据帧(x=rnorm(15),y=rnorm(15))
df.list=list(lm(y~x,df1),nls(y~exp(a+b*x),start=list(a=1,b=1,df2))

啊,看来我把我简单的例子做得太简单了。此后,我将其更改为包含数据集之间不同长度的x和y,以及两种不同类型的模型(线性和指数)。我不确定您的解决方案——从技术上讲,它对于我提供的示例是正确的,这是我的缺点——是否适用于此。有什么想法吗?听起来你应该接受这个答案来解决你提出的问题。你可以看看它对你的案子是否有效。如果没有,创建一个新的模型,并提出一个更具体的问题。但你可能也会感到惊讶,我认为不同的行数不应该是一个问题。Jarrett提供了一种方法来轻松适应不同类型的模型。我曾想过从模型中提取拟合值,但我喜欢将它们存储在列表中的想法
f1=data.frame(x=rnorm(10),y=rnorm(10))
df2=data.frame(x=rnorm(15),y=rnorm(15))

df.list=list(lm(y~x,df1),nls(y~exp(a+b*x),start=list(a=1,b=1),df2))


a<-ggplot()


#get the range of x you want to look at
x<-seq(min(c(df1$x, df2$x)), max(c(df1$x, df2$x)), .01)

#use l_ply to keep adding layers
l_ply(df.list, function(amod){

  #a data frame for predictors and response
  ndf <- data.frame(x=x)

  #get the response using predict - you can even get a CI here
  ndf$y <- predict(amod, ndf)

  #now add this new layer to the plot
  a<<- a+geom_line(ndf, mapping=(aes(x=x, y=y)))

} )

a
names(df.list) <- 1:length(df.list)
modFits <- ldply(df.list, function(amod){
  ndf <- data.frame(x=x)

  #get the response using predict - you can even get a CI here
  ndf$y <- predict(amod, ndf)

  ndf

  })


qplot(x, y, geom="line", colour=.id, data=modFits)