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

14

我试图使用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"))

结果是:enter image description here

点被正确转换(位于一条直线上),但函数没有被正确转换!

然而,如果我这样做,使用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不起作用?

1个回答

10

这是有效的:

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

enter image description here

可能的解释:

文档说明: inherit.aes 如果为FALSE,则会覆盖默认的美学设置,而不是与其结合。这对于定义数据和美学并且不应继承默认绘图规范行为的辅助函数最为有用,例如边框。

我的猜测: 由于 scale_y_continuous 改变了主图的美学设置,我们需要关闭默认的 inherit.aes=TRUE。似乎在 stat_function 中的 inherit.aes=TRUE 会从绘图的第一层中选择其美学设置,因此,除非特别选择,否则比例转换不会产生影响。


谢谢。您对为什么即使没有使用inherit.aes,使用geom_ecdf()也能起作用有何假设吗? - AF7
1
stat_ecdf 没有审美继承结构,唯一的选择是通过覆盖该层来覆盖图层审美。另一方面, stat_function 在绘图层上 superimposes 一个函数,并且 inherit.aes=TRUE(默认值)从绘图的顶层选择审美映射。让我意识到实际问题的是 stat_function 中的 _superimpose_。看起来 stat_function 被设计为遵循您构建的实际图形(顶层)的映射,而不受所有较低层次的审美映射更改的影响。 - Divi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接