2016-05-15 7 views
14

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

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

И выход должен быть что-то на линии: enter image description here Добра!

Теперь я пытаюсь преобразовать ось Y в соответствии с используемым распределением.

#Apply transformation 
gg + scale_y_continuous(trans=probability_trans("norm")) 

И результат: enter image description here

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

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

Результат OK: This wokrs OK

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

ответ

8

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

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

+0

Спасибо. Есть ли у вас гипотеза о том, почему использование 'geom_ecdf()' работает даже без 'inherit.aes'? – AF7

+1

'stat_ecdf' не имеет структуры наследования эстетики, единственный вариант - переопределить эстетику слоя, переопределив этот самый слой. 'stat_function', с другой стороны, _superimposes_ функция на слое сюжета, а' inherit.aes = TRUE' (по умолчанию) выбирает эстетические сопоставления из верхнего слоя графика. То, что дало мне фактическую проблему, было _superimpose_ в 'stat_function'.Мне кажется, что 'stat_function' был разработан, чтобы следить за сопоставлениями фактического сюжета, который вы строите (верхний слой), не затрагивая все изменения нижнего слоя в эстетических отображениях. – Divi