我试图使用R和ggplot2绘制分布的累积分布函数(CDF)。然而,当我转换Y轴以获得一条直线后,我发现在绘制CDF函数时遇到了困难。这种类型的图表经常用于Gumbel论文中,但在这里我将以正态分布为例。
我生成数据并绘制数据的累积密度函数和函数。它们很匹配。然而,当我应用Y轴变换时,它们不再匹配。
sim <- rnorm(100) #Simulate some data
sim <- sort(sim) #Sort it
cdf <- seq(0,1,length.out=length(sim)) #Compute data CDF
df <- data.frame(x=sim, y=cdf) #Build data.frame
library(scales)
library(ggplot2)
#Now plot!
gg <- ggplot(df, aes(x=x, y=y)) +
geom_point() +
stat_function(fun = pnorm, colour="red")
gg
现在,我尝试根据所使用的分布来转换Y轴。
#Apply transformation
gg + scale_y_continuous(trans=probability_trans("norm"))
点被正确转换(位于一条直线上),但函数没有被正确转换!
然而,如果我这样做,使用ggplot计算累积分布函数,一切似乎都能正常工作:
ggplot(data.frame(x=sim), aes(x=x)) +
stat_ecdf(geom = "point") +
stat_function(fun="pnorm", colour="red") +
scale_y_continuous(trans=probability_trans("norm"))
为什么会发生这种情况?为什么手动计算具有比例变换的CDF不起作用?
inherit.aes
,使用geom_ecdf()
也能起作用有何假设吗? - AF7stat_ecdf
没有审美继承结构,唯一的选择是通过覆盖该层来覆盖图层审美。另一方面,stat_function
在绘图层上 superimposes 一个函数,并且inherit.aes=TRUE
(默认值)从绘图的顶层选择审美映射。让我意识到实际问题的是stat_function
中的 _superimpose_。看起来stat_function
被设计为遵循您构建的实际图形(顶层)的映射,而不受所有较低层次的审美映射更改的影响。 - Divi