geom_ribbon 条件填充创建与数据不匹配的形状(ggplot2 r)

问题描述 投票:0回答:1

我正在使用

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 重叠)应为红色阴影。它不应该是与灰丝带分开的丝带。

r if-statement ggplot2 fill geom-ribbon
1个回答
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"))

在两组之间转换时存在一些不连续性。我想你必须决定如何为这些区域着色。

© www.soinside.com 2019 - 2024. All rights reserved.