2014-12-22 10 views
5

Esiste un metodo per sovrapporre qualcosa di analogo a una curva di densità quando l'asse verticale è frequenza o frequenza relativa? (Non è una funzione di densità effettiva, poiché l'area non deve essere integrata in 1.) La seguente domanda è simile: ggplot2: histogram with normal curve e l'utente risponde automaticamente all'idea di ridimensionare ..count.. all'interno di geom_density(). Tuttavia questo sembra insolito.Sovrapposizione della curva "Densità" sull'istogramma in cui l'asse verticale è la frequenza (ovvero il conteggio) o la frequenza relativa?

Il seguente codice produce una linea di "densità" eccessivamente rigida.

df1   <- data.frame(v = rnorm(164, mean = 9, sd = 1.5)) 
b1    <- seq(4.5, 12, by = 0.1) 
hist.1a  <- ggplot(df1, aes(v)) + 
        stat_bin(aes(y = ..count..), color = "black", fill = "blue", 
          breaks = b1) + 
        geom_density(aes(y = ..count..)) 
hist.1a 

plot

risposta

12

@ di Joran risposta/commento mi ha fatto pensare a quello che sarebbe stato il fattore di scala appropriata. Per i posteri, ecco il risultato.

Quando asse verticale è la frequenza (alias Conte)

density

Così, il fattore di scala per un asse verticale misurata in conteggi dei bin è

bincount

In questo caso , con N = 164 e la larghezza del contenitore come 0.1, l'estetica per y nella riga smussata deve essere:

y = ..density..*(164 * 0.1) 

Così il codice seguente produce una linea di "densità" ridimensionata per un istogramma misurato in frequenza (ovvero conteggio).

df1   <- data.frame(v = rnorm(164, mean = 9, sd = 1.5)) 
b1    <- seq(4.5, 12, by = 0.1) 
hist.1a  <- ggplot(df1, aes(x = v)) + 
        geom_histogram(aes(y = ..count..), breaks = b1, 
            fill = "blue", color = "black") + 
        geom_density(aes(y = ..density..*(164*0.1))) 
hist.1a 

plot

Quando ad asse verticale è la frequenza relativa

relfreq

Utilizzando quanto sopra, potremmo scrivere

hist.1b  <- ggplot(df1, aes(x = v)) + 
        geom_histogram(aes(y = ..count../164), breaks = b1, 
            fill = "blue", color = "black") + 
        geom_density(aes(y = ..density..*(0.1))) 
hist.1b 

relf

Quando ad asse verticale è la densità

hist.1c  <- ggplot(df1, aes(x = v)) + 
        geom_histogram(aes(y = ..density..), breaks = b1, 
            fill = "blue", color = "black") + 
        geom_density(aes(y = ..density..)) 
hist.1c 

dens

+0

E 'possibile estrarre il valore di questo '' '..densità..'''? – amrrs

+0

@amrrs, vedere qui su come estrarre i valori dell'istogramma.Un simile hackery ti darà la densità (ma potrebbe esserci un modo più semplice). https://stackoverflow.com/questions/7740503/getting-frequency-values-from-histogram-in-r/47137411#47137411 – PatrickT

+0

@Pat W. Questa è un'ottima risposta. Un commento molto piccolo: per ottenere la curva di densità senza i bit verticali sui bordi e il contorno della linea orizzontale, ecco un modo: '' geom_line (aes (y = ..density ..), stat = "density", lwd = 1) '', dove '' lwd'' può essere modificato per addensare la linea, se lo si desidera. – PatrickT

3

Prova a modificare:

ggplot(df1,aes(x = v)) + 
    geom_histogram(aes(y = ..ncount..)) + 
    geom_density(aes(y = ..scaled..)) 
+1

Vuoi sapere come farlo se non volevamo per scalare il conteggio a 1? –

+2

@PatW. Una stima di densità omogenea e conteggi decimati non sono sulla stessa scala (come avete osservato nel primo tentativo). Per allinearli, dovrai posizionarli sulla stessa scala. Puoi regolare quella scala per essere ciò che vuoi, ma sarà necessario un aggiustamento. – joran

Problemi correlati