在同一ggplot2上为不同的模型和数据集创建图例

时间:2015-10-15 17:33:55

标签: r ggplot2 legend

我正在使用ggplot2在同一图表中绘制具有相同自变量和不同自变量的两个回归模型。我想添加一个对应于每个不同因变量的图例。其他帖子建议使用melt()函数来执行此操作,但是,在保留模型输出的同时不清楚如何执行这些操作。例如:

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" )) 

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

1 个答案:

答案 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")

作为旁注,我不确定您认为自己对ymax内部ymingeom_smooth的看法是什么 - 它们在这里没有效果,错误是计算的按geom_smooth。也许您希望geom_ribbon使用自己的错误?

enter image description here