2015-08-25 13 views
7

Ho visto alcuni esempi durante la costruzione di una mappa termica di avere la variabile fill impostata su ..level...cosa significa ..level .. significa in ggplot :: stat_density2d

Come in questo esempio:

library(MASS) 
ggplot(geyser, aes(x = duration, y = waiting)) + 
    geom_point() + 
    geom_density2d() + 
    stat_density2d(aes(fill = ..level..), geom = "polygon") 

sospetto che l'..level.. significa che il fill è impostata la quantità relativa di strati presenti? Qualcuno potrebbe anche collegarmi con un buon esempio di come interpretare questi grafici a densità 2D, cosa rappresenta ogni contorno ecc.? Ho cercato online ma non ho trovato nessuna guida adatta.

risposta

6

Espansione sulla risposta fornita da @hrbrmstr: innanzitutto, la chiamata a geom_density2d() è ridondante. Cioè, è possibile ottenere gli stessi risultati con:

library(ggplot2) 
library(MASS) 

gg <- ggplot(geyser, aes(x = duration, y = waiting)) + 
    geom_point() + 
    stat_density2d(aes(fill = ..level..), geom = "polygon") 

Prendiamo in considerazione alcuni altri modi per visualizzare questa stima densità che possono aiutare a chiarire ciò che sta accadendo:

base_plot <- ggplot(geyser, aes(x = duration, y = waiting)) + 
    geom_point() 

base_plot + 
    stat_density2d(aes(color = ..level..)) 

Plot1

base_plot + 
    stat_density2d(aes(fill = ..density..), geom = "raster", contour = FALSE) 

Plot2

base_plot + 
    stat_density2d(aes(alpha = ..density..), geom = "tile", contour = FALSE) 

Avviso, tuttavia, non è più possibile visualizzare i punti generati da geom_point().

Plot3

Infine, ricordiamo che è possibile controllare la larghezza di banda della stima della densità. Per fare questo, passiamo x e y argomenti di larghezza di banda per h (vedi ?kde2d):

base_plot + 
    stat_density2d(aes(fill = ..density..), geom = "raster", contour = FALSE, 
       h = c(2, 5)) 

Plot4

Anche in questo caso, i punti da geom_point() sono nascosti come sono dietro la chiamata a stat_density2d().

+0

Continuo a non capire come interpretare questa mappa, a parte quelli con una densità/livello più elevati sono più probabili. Una combinazione di attesa/durata con un livello di 0,1 due volte più probabile di una con un livello di 0,05? Come posso correlare la misura con i conteggi? Sarebbe bello sapere come viene calcolato (un libro di testo per la raccomandazione "dummies" sarebbe molto apprezzato se al di fuori dello scopo di questa domanda). – user1420372

+0

@ user1420372 Vorrei cercare alcune nozioni di base sulle curve di probabilità e densità. [Questo post] (http://stats.stackexchange.com/a/147893) da stats.stackexchange dovrebbe essere d'aiuto. [Questo post] (http://stackoverflow.com/q/11546256/2572423) dovrebbe anche essere utile: stiamo praticamente visualizzando due grafici di densità individuali su una superficie. – JasonAizkalns

+1

molto utile .. ma mi porta a questa domanda: http://stackoverflow.com/questions/34939054/r-ggmap-countour-plot-convert-level-to-events-per-squared-area-of-distance – user1420372

7

le funzioni stat_ calcolano nuovi valori e creano nuovi frame di dati. questo crea un frame di dati con una variabile level. si può vedere se si utilizza ggplot_build vs tracciare il grafico:

library(ggplot2) 
library(MASS) 

gg <- ggplot(geyser, aes(x = duration, y = waiting)) + 
    geom_point() + 
    geom_density2d() + 
    stat_density2d(aes(fill = ..level..), geom = "polygon") 

gb <- ggplot_build(gg) 

head(gb$data[[3]]) 

##  fill level  x  y piece group PANEL 
## 1 #132B43 0.002 3.876502 43.00000  1 1-001  1 
## 2 #132B43 0.002 3.864478 43.09492  1 1-001  1 
## 3 #132B43 0.002 3.817845 43.50833  1 1-001  1 
## 4 #132B43 0.002 3.802885 43.65657  1 1-001  1 
## 5 #132B43 0.002 3.771212 43.97583  1 1-001  1 
## 6 #132B43 0.002 3.741335 44.31313  1 1-001  1 

Il ..level.. dice ggplot fare riferimento a quella colonna nella cornice di dati di recente costruzione.

Sotto il cofano, ggplot sta facendo qualcosa di simile a (questa non è una replica di esso al 100% in quanto utilizza diversi limiti di trama, ecc):

n <- 100 
h <- c(bandwidth.nrd(geyser$duration), bandwidth.nrd(geyser$waiting)) 
dens <- kde2d(geyser$duration, geyser$waiting, n=n, h=h) 
df <- data.frame(expand.grid(x = dens$x, y = dens$y), z = as.vector(dens$z)) 
head(df) 

##   x y   z 
## 1 0.8333333 43 9.068691e-13 
## 2 0.8799663 43 1.287684e-12 
## 3 0.9265993 43 1.802768e-12 
## 4 0.9732323 43 2.488479e-12 
## 5 1.0198653 43 3.386816e-12 
## 6 1.0664983 43 4.544811e-12 

E anche chiamando contourLines per ottenere i poligoni.

This è una buona introduzione all'argomento. Vedi anche ?kde2d in R aiuto.

+5

Grazie. Ma quale colonna è ..level .. creata da allora? – uncool

+0

Grazie, 'kde2d()' mi ha aiutato ad esportare la mappa della densità. – Matt