ska*_*kan 4 r data-visualization ggplot2
我想创建一个图表,其中正常函数从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)
Run Code Online (Sandbox Code Playgroud)
如何获得仅从-2到0填充的图?
欢迎其他选项或套餐.
我也尝试过只使用ggplot和fill选项的一个命令,但我也无法得到它.
我知道有些人使用多边形来做,但结果并不那么柔软和美观.
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")
Run Code Online (Sandbox Code Playgroud)
但它再次用单一颜色填充所有曲线,蓝色.红色的一半似乎被覆盖了.与geom_ribbon和其他选项相同.
Joe*_*der 15
试试这个:
ggplot(data.frame(x = c(-2, 2)), aes(x)) +
stat_function(fun = dnorm) +
stat_function(fun = dnorm,
xlim = c(-2,0),
geom = "area")
Run Code Online (Sandbox Code Playgroud)
如今,通过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)
)
)
Run Code Online (Sandbox Code Playgroud)

这种方法也适用于其他统计数据,例如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)
)
)
Run Code Online (Sandbox Code Playgroud)

你不能用它来生成你的分布数据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))
Run Code Online (Sandbox Code Playgroud)