2015-10-15 94 views
0

我使用ggplot2在同一图表中绘制了两个具有相同独立变量和不同自变量的回归模型。我想添加一个对应于每个不同因变量的图例。其他职位建议使用melt()函数来做到这一点,但是,如何在保留模型输出的同时做到这一点还不清楚。例如:在同一ggplot2上创建不同模型和数据集的图例

require(ggplot2) 
set.seed(123) 
dat <- data.frame(x = rnorm(100), z = rnorm(100), y1 = rnorm(100), y2 = rnorm(100)) 
dat1 <- dat[,c(1,2,3)] 
dat2 <- dat[,c(1,2,4)] 

mod1 <- lm(y1 ~ x + z, data = dat1) 
mod2 <- lm(y2 ~ x + z, data = dat2) 


dat1$mod1 <- predict(mod1, newdata =dat1) 
err <- predict(mod1, newdata =dat1, se = TRUE) 
dat1$ucl <- err$fit + 1.96 * err$se.fit 
dat1$lcl <- err$fit - 1.96 * err$se.fit 


dat2$mod2 <- predict(mod2, newdata =dat2) 
err <- predict(mod2, newdata =dat2, se = TRUE) 
dat2$ucl <- err$fit + 1.96 * err$se.fit 
dat2$lcl <- err$fit - 1.96 * err$se.fit 


ggplot(dat1) + 
     geom_point(aes(x = x, y = mod1), size = .8, colour = "black") + 
     geom_smooth(data = dat1, aes(x= x, y = mod1, ymin = lcl, ymax = ucl), 
        size = 1, colour = "darkblue", se = TRUE, stat = "smooth", 
        method = "lm") + 

     geom_point(data = dat2, aes(x = x, y = mod2), size = .8, colour = "black") + 
     geom_smooth(data = dat2, aes(x= x, y = mod2, ymin = lcl, ymax = ucl), 
        size = 1, colour = "darkred", se = TRUE, stat = "smooth", 
        method = "lm") + 
     scale_colour_manual(values = c("y1" = "darkred", "y2" = "red")) 

有关如何做到这一点的任何想法?谢谢。

+0

您对'ggplot'呼叫使用3个数据帧(DAT,DAT1,DAT2),但你的代码仅创建'dat'。正如你所指出的,答案可能涉及到'melt()',但是一旦你修复了数据创建代码以对应于'ggplot'引用的数据帧,它就会更容易帮助你。致歉; – eipi10

+0

道歉;适当编辑。 –

回答

4

下面是我该怎么做。首先我们gather一切(这是tidyr融化),然后绘制出来。这里的关键是使用group = model来分离数据。 提供的数据进行了编辑,我们首先需要重组它喜欢它是:

dat <- dat1 
dat$mod2 <- dat2$mod2 

然后我们使用tidyr把它变成长期的数据:

library(tidyr) 
dat1 <- dat %>% gather(model, val, mod1, mod2) 

然后我们就可以绘制(请注意AES的清理,你可以调用它一次,然后继承):

library(ggplot2) 
ggplot(dat1, aes(x = x, y = val, group = model)) + 
    geom_point(size = .8, colour = "black") + 
    geom_smooth(aes(col=model), size = 1, se = TRUE, stat = "smooth", method = "lm") 

作为一个方面说明,我不知道你在想什么,你都在ymaxymin做方geom_smooth - 这里没有效果,错误计算方法为geom_smooth。也许你想geom_ribbon使用你自己的错误?

enter image description here

+0

谢谢,这太好了。出于好奇,有没有什么办法可以手动添加它,而不是先将所有模型融合在一起? –

+1

不[很容易](https://stackoverflow.com/questions/17148679/ggplot2-need-to-construct-a-manual-legend-for-complicated-plot) – jeremycg