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

Я пытаюсь построить дистрибутив CDF, используя R и ggplot2. Однако у меня возникают трудности с построением функции CDF после того, как я преобразовал ось Y, чтобы получить прямую линию. Этот тип графика часто используется в графиках бумаги Гамбеля, но здесь я буду использовать в качестве примера нормальное распределение.

Я генерирую данные и строю кумулятивную функцию плотности данных вместе с функцией. Они подходят хорошо. Однако, когда я применяю преобразование оси 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"))

Результат в порядке: Это работает нормально

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


person AF7    schedule 15.05.2016    source источник


Ответы (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 выбирает свою эстетику из первого слоя сюжета, поэтому преобразование масштаба не влияет, если оно не выбрано специально.

person Divi    schedule 17.05.2016
comment
Спасибо. У вас есть гипотеза, почему использование geom_ecdf() работает даже без inherit.aes? - person AF7; 18.05.2016
comment
stat_ecdf не имеет структуры наследования эстетики, единственный вариант — переопределить эстетику слоя, переопределив этот самый слой. stat_function, с другой стороны, накладывает функцию на слой графика, а inherit.aes=TRUE (по умолчанию) выбирает эстетические отображения из верхнего слоя графика. Что выдало мне настоящую проблему, так это наложение в stat_function. Мне кажется, что stat_function был разработан, чтобы следовать отображениям фактического сюжета, который вы строите (верхний слой), не подвергаясь влиянию всех изменений нижнего слоя на эстетические отображения. - person Divi; 18.05.2016