ggplot比例变换对点和函数的作用不同

AF7*_*AF7 14 r transform normal-distribution ggplot2 cdf

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

输出应该是以下几点: 在此输入图像描述 好!

现在我尝试根据使用的分布变换Y轴.

#Apply transformation
gg + scale_y_continuous(trans=probability_trans("norm"))
Run Code Online (Sandbox Code Playgroud)

结果是: 在此输入图像描述

点被正确转换(它们位于一条直线上),但功能不是!

但是,如果我这样做,一切似乎都能正常工作,用ggplot计算CDF:

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"))
Run Code Online (Sandbox Code Playgroud)

结果还可以: 这真是太棒了

为什么会这样?为什么不手动计算CDF使用比例变换?

Div*_*ivi 9

这有效:

gg <- ggplot(df, aes(x=x, y=y)) +
  geom_point() +
  stat_function(fun ="pnorm", colour="red", inherit.aes = FALSE) +
  scale_y_continuous(trans=probability_trans("norm"))
gg
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

可能的解释:

文档状态: inherit.aes如果为FALSE,则覆盖默认美学,而不是与它们组合.这对于定义数据和美学的辅助函数最有用,不应该从默认的绘图规范继承行为,例如边界.

我的猜测:scale_y_continuous改变主要情节的美学时,我们需要关闭默认值inherit.aes=TRUE.它似乎从图的第一层inherit.aes=TRUEstat_function选择了它的美学,因此除非特别选择,否则尺度转换不会产生影响.