我正在使用ggplot2
来可视化模型结果.
我有一个模型结果,产生了results
个物体,一个 pyramid .我的可视化代码如下所示:
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
种不同的着色 colored颜色 (当上限和下限都在0以上或都在0以下时).然而现在它在已经着色的区域上绘制了额外的填充,而蓝色填充的边缘甚至与之前的平滑geom_ribbon
不匹配.我try 只提供fill
论点,而不是color
论点,反之亦然.我也try 过使用geom_ribbon
的aes
来代替整体情节,但这些try 都没有解决问题.
如何修复这个问题,以便仅在数据的实际边界内有条件地填充/着色图?
EDIT (w/ 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重叠)应该涂成红色.它不应该是与灰色丝带分开的丝带.