2011-08-24 5 views
9

Mam pytanie prawdopodobnie podobne do Fitting a density curve to a histogram in R. Korzystanie qplot Stworzyłem 7 histogramy z tym poleceniem:Jak dodać krzywa gaussowska do histogramu utworzonego za pomocą qplot?

Dla każdego segmentu, chciałbym dodać dopasowania krzywej Gaussa. Kiedy próbuję użyć lines() metodę, otrzymuję błąd:

Error in plot.xy(xy.coords(x, y), type = type, ...) : 
plot.new has not been called yet 

Co to jest polecenie, aby zrobić to prawidłowo?

+1

nie można mieszać funkcje graficzne linie bazowe ('()' etc) z grafiką jak siatki wykorzystywane przez ** gpplot2 ** oraz ** ** kratowych pakietów. –

Odpowiedz

14

Czy próbowałeś już stat_function?

+ stat_function(fun = dnorm) 

Pewnie chce wykreślić histogramy pomocą aes(y = ..density..) aby wykreślić wartości gęstości niż hrabiów.

Wiele przydatnych informacji można znaleźć w pytaniu this, w tym kilka wskazówek dotyczących wykreślania różnych krzywych normalnych na różnych stronach.

Oto przykłady:

dat <- data.frame(x = c(rnorm(100),rnorm(100,2,0.5)), 
        a = rep(letters[1:2],each = 100)) 

nakładane jedna normalnie gęstość każdego aspektu:

ggplot(data = dat,aes(x = x)) + 
    facet_wrap(~a) + 
    geom_histogram(aes(y = ..density..)) + 
    stat_function(fun = dnorm, colour = "red") 

enter image description here

od kwestii, że związane, tworzyć oddzielną ramkę danych z różne normalne krzywe:

grid <- with(dat, seq(min(x), max(x), length = 100)) 
normaldens <- ddply(dat, "a", function(df) { 
    data.frame( 
    predicted = grid, 
    density = dnorm(grid, mean(df$x), sd(df$x)) 
) 
}) 

i wykreślić je oddzielnie przy użyciu geom_line:

ggplot(data = dat,aes(x = x)) + 
    facet_wrap(~a) + 
    geom_histogram(aes(y = ..density..)) + 
    geom_line(data = normaldens, aes(x = predicted, y = density), colour = "red") 

enter image description here

+0

Jestem bardzo początkujący w R, wystarczy go przez kilka dni. Przyjrzę się temu, dzięki za podpowiedź! – mkk

+0

Muito Bom! Ja ajudou horrores !!!! – Jean

5

ggplot2 wykorzystuje paradygmat różnych grafik niż grafik bazowych. (Chociaż można użyć grid grafiki z niego, najlepszym sposobem jest dodanie nowego stat_function warstwę fabuły. Kod ggplot2 jest następujący.

Zauważ, że nie mogę uzyskać to do pracy za pomocą qplot, ale przejście do ggplot jest rozsądnie straighforward, najważniejszą różnicą jest to, że dane musi być w data.frame formacie

również zwrócić uwagę na wyraźne odwzorowanie y estetyczny aes=aes(y=..density..)). - to jest nieco spokojniejsza ale bierze niezwykłe rezultaty i stat_function mapuje go do danych:

library(ggplot2) 
data <- data.frame(V1 <- rnorm(700), V2=sample(LETTERS[1:7], 700, replace=TRUE)) 
ggplot(data, aes(x=V1)) + 
    stat_bin(aes(y=..density..)) + 
    stat_function(fun=dnorm) + 
    facet_grid(V2~.) 

enter image description here