R geom_ribbon 密度曲线下的区域未在区间内正确着色

R geom_ribbon not shading area under density curve properly over interval

我正在尝试使用下面的代码将对数正态密度图下的区域遮蔽一定时间间隔。这在过去使用其他密度函数和间隔对我有用,但由于某种原因现在它产生了你可以在图中看到的缺陷。

library(ggplot2)
library(plyr)
library(dplyr)
library(tidyr)

x <- seq(0, 43, 0.1)

x_min <- 16
x_max <- 22
df <- data.frame(x = x, f = dlnorm(x, meanlog = 2.5,
                                     sdlog = 0.24))
df <- df %>% mutate(area = ifelse(x >= x_min & x < x_max,
                                      "Participating", "Not Participating"))
gg <- ggplot(data = df, aes(x = x, ymin = 0, ymax = f, fill = area))
gg <- gg + geom_ribbon()
gg <- gg + theme(legend.title = element_blank())
gg

这里的问题是您正在尝试使用由两部分组成的丝带。因此,两个预期的红色区域会尝试相互连接:ymax 左侧区域结束,ymax 右侧区域开始,ymin 也是如此。可能以前你一直用这个方法做尾部分布,从来没有出现过这个问题。

要解决这个问题,您将需要以某种方式手动拥有两个 geom_ribbon。一个不是特别侵入性的方式是

gg <- ggplot(data = df, aes(x = x, ymin = 0, ymax = f))
gg <- gg + geom_ribbon(aes(fill = factor("Not participating")))
gg <- gg + geom_ribbon(data = df[df$area == "Participating", ], aes(fill = area))
gg <- gg + theme(legend.title = element_blank())

根据您希望处理的颜色,它可能会更进一步 modified/simplified。