首页 > 解决方案 > 如何将 lowess(或 lm)线添加到现有的 facet_grid

问题描述

情况就是这样,我有三组数据(例如,A、B 和 C)。我想绘制 X 和 Y 之间的关系,以及不同面板中的组。十分简单:

set.seed(111)
groups = sample(c("A", "B", "C"), 1500, replace=T)
x=rnorm(1500); y = rnorm(1500, 0, sqrt(1-.25^2))
y = model.matrix(y~x*groups + I(x^2)) %*% c(0, .5, 1, 2, -.2, .2, .5) + rnorm(1500, 0, sqrt(1-.25^2))
d = data.frame(x=x, y=y, groups=groups)
b = ggplot(data=d, aes(x, y)) +
    geom_point() +
    geom_smooth() + 
    facet_wrap(~groups) +
    theme_bw()
b

在此处输入图像描述

问题是很难直观地比较面板上的预测线。(在这个简单的示例中,这并不难,但对于我拥有的应用程序来说却很难)。我认为一个好主意是在 B/C 面板中覆盖面板 A 的最低线(例如,可能是红线)。我的第一个想法是为仅包含来自面板 A 的信息的子集数据集创建一个新的 geom_smooth 并将其绘制在面板中,但我不知道如何在现有面板被绘制后修改它们。

有任何想法吗?

标签: rggplot2

解决方案


这不是容易,但您可以使用ggplot_build()从平滑中提取计算信息:

g0 <- ggplot(data=subset(d,groups=="A"), aes(x,y))+geom_smooth()
d_smooth <- ggplot_build(g0)$data[[1]]
## add line to existing plot   
b + geom_line(data=d_smooth,colour="red")

在此处输入图像描述


推荐阅读