我正在使用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) 


这运行良好,并生成以下情节:

plo1

然而,我想以重要性为条件来填充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) 

I get this plot: plot2

这对我来说是错误的.我应该在它已经拥有的范围内拥有相同的geom_ribbon种不同的着色 colored颜色 (当上限和下限都在0以上或都在0以下时).然而现在它在已经着色的区域上绘制了额外的填充,而蓝色填充的边缘甚至与之前的平滑geom_ribbon不匹配.我try 只提供fill论点,而不是color论点,反之亦然.我也try 过使用geom_ribbonaes来代替整体情节,但这些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


plot3

deriv1表明只有geom_ribbon的开头和结尾之前的部分应该涂成红色,因为只有这些部分不与0重叠.然而,当着色为条件时,deriv2的输出如下:

plot4

这与所需的输出根本不匹配.所需的输出应该是,仅第一部分和最后部分(其中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"))

enter image description here There are some discontinuities when transitioning between the two groups. I guess you'd have to decide how you want to color those regions.

R相关问答推荐

ggplot 2中的地块底图(basemaps_gglayer()不起作用)

更改绘图上的x轴断点,而不影响风险?

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

手动打印线型gplot

制作等距离的线串副本

为什么我的基准测试会随着样本量的增加而出现一些波动?

如何在观测缺失的地方添加零

即使硬币没有被抛出,也要保持对其的跟踪

提取第一个下划线和最后一个下划线之间的任何内容,例外情况除外

使用范围和单个数字将数字与字符串进行比较

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

从R中发出的咕噜声中的BUG?

如何计算每12行的平均数?

变长向量的矢量化和

长/纬点继续在堪萨斯-SF结束,整齐的人口普查

具有自定义仓位限制和计数的GGPLATE直方图

了解nchar在列表上的意外行为

无法保存gglot的所有pdf元素

带有Bootswatch Cerulean主题的shiny 仪表板中的浏览&按钮可见性问题

使用卡环从R中的列中删除单位(&C)