我正在使用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" ))
有关如何做到这一点的任何想法?谢谢。
答案 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
内部ymin
和geom_smooth
的看法是什么 - 它们在这里没有效果,错误是计算的按geom_smooth
。也许您希望geom_ribbon
使用自己的错误?