ggplot 比例变换对点和函数的作用不同
ggplot scale transformation acts differently on points and functions
我正在尝试使用 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 计算 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"))
结果还可以:
为什么会这样?为什么手动计算 CDF 不适用于比例变换?
有效:
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
可能的解释:
文档状态:
inherit.aes
如果为 FALSE,则覆盖默认美学,而不是与它们结合。这对于定义数据和美学的辅助函数最有用,并且不应从默认绘图规范继承行为,例如边框。
我的猜测:
由于scale_y_continuous
改变了主线剧情的美感,我们需要关闭默认的inherit.aes=TRUE
。 stat_function
中的 inherit.aes=TRUE
似乎从情节的第一层中挑选它的美学,因此除非特别选择,否则比例变换不会影响。
我正在尝试使用 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 计算 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"))
结果还可以:
为什么会这样?为什么手动计算 CDF 不适用于比例变换?
有效:
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
可能的解释:
文档状态:
inherit.aes
如果为 FALSE,则覆盖默认美学,而不是与它们结合。这对于定义数据和美学的辅助函数最有用,并且不应从默认绘图规范继承行为,例如边框。
我的猜测:
由于scale_y_continuous
改变了主线剧情的美感,我们需要关闭默认的inherit.aes=TRUE
。 stat_function
中的 inherit.aes=TRUE
似乎从情节的第一层中挑选它的美学,因此除非特别选择,否则比例变换不会影响。