我正在使用
ggplot2
来可视化模型结果。
我在
results
对象(数据框)中有一个模型结果。我的可视化代码如下所示:
results |>
mutate(Confidence = if_else((CI_high < 0 & CI_low < 0) | (CI_high > 0 & CI_low > 0),"Significant","Not Significant")) |>
ggplot(aes(x=time,y=Coefficient,ymin=CI_low,ymax=CI_high)) + geom_line() + geom_ribbon(alpha=0.3)
这工作得很好,并产生以下情节:
但是,我想让
geom_ribbon
的填充以重要性为条件,如上面的 if_else 条件所示。但是当我使用以下代码绘制它时:
results |>
mutate(Confidence = if_else((CI_high < 0 & CI_low < 0) | (CI_high > 0 & CI_low > 0),"Significant","Not Significant")) |>
ggplot(aes(x=time,y=Coefficient,ymin=CI_low,ymax=CI_high,color=Confidence,fill=Confidence)) + geom_line() + geom_ribbon(alpha=0.3)
这对我来说是错误的。我应该在已有的边界内使用相同的
geom_ribbon
阴影不同颜色(当上限和下限都高于或都低于 0 时)。但现在它在已经着色的区域上绘制了额外的填充,并且蓝色填充的边缘甚至与之前的平滑 geom_ribbon
不匹配。我尝试仅提供 fill
参数,而不是 color
参数,反之亦然。我也尝试过使用geom_ribbon
的aes
来代替整体情节,但这些尝试都没有解决问题。
如何修复此问题,以便仅在数据的实际边界内有条件地填充/着色绘图?
编辑(使用 Reprex)
这是一个可重现的示例,也演示了该问题
library(modelbased)
library(tidyverse)
gam1 <- mgcv::gam(mpg ~ cyl +
s(disp), data = mtcars, method = "REML")
deriv1 <- modelbased::estimate_slopes(gam1,
trend = "disp",
at = "disp",
length = 100) |>
ggplot(aes(x=disp,y=Coefficient,ymin=CI_low,ymax=CI_high)) + geom_line() + geom_ribbon(alpha=0.3)
deriv2 <- modelbased::estimate_slopes(gam1,
trend = "disp",
at = "disp",
length = 100) |> mutate(Confidence = if_else(CI_high < 0 & CI_low < 0 | CI_high > 0 & CI_low > 0,"Significant","Not Significant")) |>
ggplot(aes(x=disp,y=Coefficient,ymin=CI_low,ymax=CI_high)) + geom_line() + geom_ribbon(alpha=0.3,aes(color=Confidence,fill=Confidence)) + scale_color_manual(values=c("red","grey"),breaks = c("Significant","Not Significant")) + scale_fill_manual(values=c("red","grey"),breaks = c("Significant","Not Significant"))
deriv1
deriv2
deriv1
显示只有 geom_ribbon
的最开始和最末端之前的部分应该被着色为红色,因为只有这些部分不与 0 重叠。但是,当着色有条件时, 的输出deriv2
如下:
这与所需的输出根本不匹配。所需的输出应该是只有第一部分和最后部分之前的部分(其中 ymin 和 ymax 不与 0 重叠)应为红色阴影。它不应该是与灰丝带分开的丝带。
它看起来很奇怪,因为它不知道左侧的重要部分与右侧的重要部分没有连接。您可以添加显式分组变量来了解哪些部分应该绘制在一起
modelbased::estimate_slopes(gam1,
trend = "disp",
at = "disp",
length = 100) |>
mutate(Confidence = if_else(CI_high < 0 & CI_low < 0 | CI_high > 0 & CI_low > 0,"Significant","Not Significant")) |>
mutate(Group = consecutive_id(Confidence)) |>
ggplot(aes(x=disp,y=Coefficient,ymin=CI_low,ymax=CI_high)) +
geom_line() +
geom_ribbon(alpha=0.3,aes(color=Confidence,fill=Confidence, group=Group)) +
scale_color_manual(values=c("red","grey"),breaks = c("Significant","Not Significant")) +
scale_fill_manual(values=c("red","grey"),breaks = c("Significant","Not Significant"))