2016-05-15 20 views
14

R ve ggplot2 kullanarak bir dağıtım CDF'si çizmek istiyorum. Ancak, Y eksenini düz bir çizgi elde etmek için dönüştürdikten sonra CDF fonksiyonunu çizerken zorluklar buluyorum. Bu tür bir çizim, Gumbel kağıt çizimlerinde sıkça kullanılır, ancak örnek olarak normal dağılımı kullanacağım.ggplot ölçek dönüşümü, noktalar ve işlevler üzerinde farklı davranır

Verileri oluşturup, verilerle birlikte kümülatif yoğunluk işlevini çiziyorum. İyi uyuyorlar. Ancak, Y ekseni dönüşümü uyguladığımda artık uymuyorlar.

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 

Ve çıkış hatları üzerinde bir şey olmalı: enter image description here İyi!

Şimdi Y eksenini, kullanılan dağıtıma göre dönüştürmeyi deniyorum. enter image description here

noktalarının doğru (onlar düz bir çizgi üzerinde yalan) dönüşür, ancak işlevi değildir:

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

Ve sonuç! This wokrs OK

neden oluyor:

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")) 

sonuç normaldir:

Ancak, her şey ggplot ile CDF hesaplama, böyle yaparsan iyi iş gibi görünüyor? Neden CDF'yi hesaplamıyor, ölçek dönüşümleri ile manuel olarak çalışıyor?

cevap

8

Bu çalışır:

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

Olası açıklama:

Belgeleme Devletleri: inherit.aes YANLIŞ ise daha ziyade onlarla birleştirerek daha varsayılan estetiği geçersiz kılar . Bu, hem verileri hem de estetiği tanımlayan ve davranışı varsayılan çizim belirtiminden devralmaması gereken yardımcı işlevler için en faydalıdır. Sınırlar.

Benim tahminim: Ana arsa estetiği değiştirir scale_y_continuous olarak, varsayılan inherit.aes=TRUE kapatmanız gerekir. stat_function numaralı telefondan inherit.aes=TRUE, estetiğini çizimin ilk katmanından alır ve bu nedenle, ölçek dönüşümü özellikle seçilmediği sürece etki etmez.

+0

Teşekkür ederiz. Geom_ecdf() işlevinin "inherit.aes" olmadan bile çalışmasına ilişkin bir hipoteziniz var mı? – AF7

+1

'stat_ecdf' hiçbir estetik kalıtım yapısına sahip değildir, tek seçenek bu katmanı geçersiz kılarak katman estetiğini geçersiz kılmaktır. 'stat_function' öte yandan _superimposes_ komplo katmanında bir fonksiyon ve' inherit.aes = TRUE' (varsayılan), komploun üst katmanından estetik eşleştirmeler seçer. Asıl problemi bana veren şey, “stat_function” içinde _superimpose_ idi.stat_function' estetik eşleşmelerinin tüm alt tabaka değişimlerinden etkilenen almadan size inşa fiili arsa (üst katman) eşleşmelerini izlenmeleri için tasarlandı 'geliyor bana. – Divi