在曲线下填充 ggplot 图

Filling under the a curve with ggplot graphs

我想创建一个图形,其中从 x=-2 到 x=2 的法线函数填充在从 -2 到 0 的曲线下方。 我试过 ggplot2

qplot(c(-2, 2), stat="function", fun=dnorm, geom="line") +
+ geom_area(aes(xlim=c(-2,0)),stat="function", fun=dnorm)

但我把这张图完全填满了(黑色)

我怎样才能得到一个只从 -2 到 0 填充的图?

欢迎其他选项或包。

我也试过只用一个带有 ggplot 和 filled 选项的命令,但我也做不到。
我知道有些人使用多边形来做,但结果不是那么柔软和漂亮。

PD:我再说一遍,我正在寻找的解决方案涉及不预先生成 x、y 坐标,而是直接使用带有 stat="function"、fun=dnorm 或类似函数的函数。因此,我的问题不是重复的。

我也试过了

ggplot(NULL,aes(x=c(-2,2))) +  geom_area(aes(x=c(-2,0)),stat="function", fun=dnorm, fill="red") +
geom_area(aes(x=c(0,2)),stat="function", fun=dnorm, fill="blue")  

但它再次用单一颜色蓝色填充所有曲线。红色的一半似乎被覆盖了。与 geom_ribbon 和其他选项相同。

你不能用 dnorm 生成分布数据吗?

library(ggplot2)
x<-seq(-2,2, 0.01)
y<-dnorm(x,0,1)
xddf <- data.frame(x=x,y=y)
qplot(x,y,data=xddf,geom="line")+
  geom_ribbon(data=subset(xddf ,x>-2 & x<0),aes(ymax=y),ymin=0,
              fill="red",colour=NA,alpha=0.5)+
  scale_y_continuous(limits=c(0, .4))

试试这个:

ggplot(data.frame(x = c(-2, 2)), aes(x)) +
  stat_function(fun = dnorm) + 
  stat_function(fun = dnorm, 
                xlim = c(-2,0),
                geom = "area") 

如今,有了 after_stat()after_scale(),您还可以使用 一种更灵活的方法,可让您明确映射 x 值的范围 填充部分。

例如填充一些正态分布的分位数:

library(ggplot2)

breaks <- qnorm(c(0, .05, .2, .5, .8, .95, 1))

ggplot(data.frame(x = c(-2, 2)), aes(x)) +
  scale_fill_brewer("x") +
  stat_function(
    n = 512,
    fun = dnorm,
    geom = "area",
    colour = "gray30",
    aes(
      fill = after_stat(x) |> cut(!!breaks),
      group = after_scale(fill)
    )
  )

这种方法也适用于其他统计数据,例如stat_density() 核密度估计:

set.seed(42)

ggplot(data.frame(x = rnorm(1000)), aes(x)) +
  scale_fill_brewer("x") +
  stat_density(
    n = 512,
    geom = "area",
    colour = "gray30",
    aes(
      fill = after_stat(x) |> cut(!!breaks),
      group = after_scale(fill)
    )
  )