在曲线下填充 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)
)
)
我想创建一个图形,其中从 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)
)
)