ggplot:填充正态曲线下的小区域:删除 "joining" 区域

ggplot: Fill small area under normal curve: remove "joining" area

我想填充曲线下的一小块区域。然而,ribbon geoms 加入了分布的两个 "parts"。

library(tidyverse)
density(rnorm(1000, 0, 1)) %$%
  data.frame(x=x, y=y) %>%
  mutate(area = dplyr::between(x, 1.5, 2.6)) %>%
  ggplot() +
  geom_ribbon(aes(x = x, ymin = 0, ymax = y, fill = area))

我相信避免这种行为的方法之一是将分布分成三个不同的部分,并用相同的颜色填充其中的两个部分。但是,我正在寻找一种更简洁优雅的方式。

问题是红丝带插值穿过蓝色区域的方式,那里没有红色值,因此绘制一条直线到下一个红点。您可以通过先绘制整个色带而不考虑 area,然后在顶部绘制子集来解决此问题:

library(tidyverse)
density(rnorm(1000, 0, 1)) %$%
    data.frame(x=x, y=y) %>%
    mutate(area = dplyr::between(x, 1.5, 2.6)) %>%
    ggplot(aes(x = x, ymin = 0, ymax = y)) +
    geom_ribbon(aes(fill = "Outside")) +
    geom_ribbon(aes(fill = "Inside"), data = function(df) df %>% filter(area))

结果: