Преобразование шкалы ggplot действует по-разному на точки и функции

Я пытаюсь построить дистрибутив CDF с помощью R и ggplot2. Однако я затрудняюсь при построении функции CDF после преобразования оси Y для получения прямой линии. Этот вид сюжета часто используется на графических страницах 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"))

И результат: введите описание изображения здесь

Точки преобразуются правильно (они лежат на прямой линии), но функция не является!

Однако все работает нормально, если мне это нравится, вычисляя CDF с помощью 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"))

Результат: ОК: Это wokrs OK

Почему это происходит? Почему не вычисляет работу CDF с помощью масштабных преобразований?

Ответы

Ответ 1

Это работает:

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. Кажется, что inherit.aes=TRUE в stat_function выбирает свою эстетику из первого слоя графика, и поэтому масштабное преобразование не влияет, если специально не выбрано.