2011-04-16 23 views
41

Yoğunluk değerleri histogramı yapmaya çalışıyorum ve yoğunluk fonksiyonunun eğrisiyle (yoğunluk tahmini değil) bindirmeye çalışıyorum.Histogram histogramı yoğunluk eğrisi ile

x <- rnorm(1000) 

Yapabileceğim: Basit bir standart normal örneği kullanarak

, burada bazı veriler

q <- qplot(x, geom="histogram") 
q + stat_function(fun = dnorm) 

ama bu frekanslar değil yoğunlukları içinde histogram ölçeğini verir.

q <- qplot(x,..density.., geom="histogram") 
q 

Ama şimdi bu hata veriyor: ..density.. ile ben histogram üzerinde uygun bir ölçek elde edebilirsiniz ben göremiyorum şey

q + stat_function(fun = dnorm) 

var mı?

Başka bir soru, curve() gibi bir işlevin eğrisini çizmenin bir yolu var, ancak katman olarak değil mi?

+1

mesele tanımladığınız olmasıdır "qplot" içinde ..sansity .. kullanarak arsa için küresel bir y. Bu 'stat_function'ı karıştırır. En kolay düzeltme 'qplot (x, geom = 'blank') + geom_histogram (aes (y = ..density ..)) + stat_function (fun = dnorm)' yazmak olacaktır. – Ramnath

+1

'un altındaki ayrıntılı cevabımı gör' eğrisine eşdeğerdir (dnorm, -4, 4) 'qplot (x = -4: 4, stat = 'function', fun = dnorm, geom = 'line')' – Ramnath

+0

Ah doğru, ilk argüman olarak işlevini denedim ama şimdi neyin yanlış gittiğini görüyorum. Teşekkürler! –

cevap

45

İşte başlıyor!

# create some data to work with 
x = rnorm(1000); 

# overlay histogram, empirical density and normal density 
p0 = qplot(x, geom = 'blank') + 
    geom_line(aes(y = ..density.., colour = 'Empirical'), stat = 'density') + 
    stat_function(fun = dnorm, aes(colour = 'Normal')) +      
    geom_histogram(aes(y = ..density..), alpha = 0.4) +       
    scale_colour_manual(name = 'Density', values = c('red', 'blue')) + 
    theme(legend.position = c(0.85, 0.85)) 

print(p0) 
+7

P.S. Eğer gerçek verilerle çalışıyorsa, ampirik ortalama ve sd argümanlarını dnorm fonksiyonuna aktardığınızdan emin olun, sözdizimi için stat_function yardımına bakın. –

+1

Sadece meraktan: Bu ggplot() işlevi kullanılarak nasıl yapılır? Ggplot() 'nin çalışma şeklini çok az anlamıştım, bu yüzden bu yaklaşımı kullanarak işlerimi biraz garip hissediyorum. – Jemus42

+2

@ Jemus42, ilk satırı bu gibi bir şeyle değiştirebilirsin "ggplot (data.frame (x), aes (x = x)) +" – nzcoops

21

Bir Ramnath cevabı daha çıplak kemikleri alternatif qplot yerine gözlemlenen ortalama ve standart sapma geçen ve ggplot kullanarak:

df <- data.frame(x = rnorm(1000, 2, 2)) 

# overlay histogram and normal density 
ggplot(df, aes(x)) + 
    geom_histogram(aes(y = ..density..)) + 
    stat_function(fun = dnorm, 
       args = list(mean = mean(df$x), sd = sd(df$x)), 
       lwd = 2, 
       col = 'red') 

enter image description here