2015-08-25 13 views
7

Ich habe einige Beispiele gesehen, wenn eine Heatmap der fill Variable auf ..level.. gesetzt wurde.Was bedeutet ..level .. bedeuten in ggplot :: stat_density2d

wie sie in diesem Beispiel:

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

Ich nehme an, daß die ..level.. bedeutet, dass die fill Gegenwart in die relative Menge von Schichten gesetzt ist? Könnte mir jemand auch ein gutes Beispiel dafür geben, wie man diese 2D-Dichte-Diagramme interpretiert, was jede Kontur repräsentiert usw.? Ich habe online gesucht, konnte aber keinen passenden Guide finden.

Antwort

6

Erweitern auf die Antwort von @hrbrmstr - zuerst ist der Aufruf an geom_density2d() redundant. Das heißt, können Sie die gleichen Ergebnisse erzielen mit:

library(ggplot2) 
library(MASS) 

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

Lassen Sie uns einige andere Möglichkeiten, betrachten diese Dichteschätzung zu visualisieren, die helfen können zu klären, was los ist:

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) 

Beachten Sie jedoch, dass die von geom_point() generierten Punkte nicht mehr angezeigt werden.

Plot3

Schließlich ist zu beachten, dass Sie die Bandbreite der Dichteschätzung steuern kann. Um dies zu tun, geben wir x und y Bandbreite Argumente h (siehe ?kde2d):

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

Plot4

Auch hier werden die Punkte der geom_point() versteckt sind, wie sie hinter dem Aufruf von stat_density2d() sind.

+0

Ich verstehe immer noch nicht, wie man diese Karte interpretiert, außer denen mit einer höheren Dichte/Ebene sind wahrscheinlicher. Ist eine Wartungs-/Dauerkombination mit einem Wert von 0,1 doppelt so wahrscheinlich als einer mit einem Wert von 0,05? Wie kann ich das Maß auf die Anzahl beziehen? Es wäre schön zu wissen, wie es berechnet wird (ein Lehrbuch für "Dummies" -Empfehlung wäre sehr zu begrüßen, wenn es nicht in den Rahmen dieser Frage fällt). – user1420372

+0

@ user1420372 Ich würde einige Grundlagen um Wahrscheinlichkeit und Dichte Kurven nachschlagen. [Dieser Beitrag] (http://stats.stackexchange.com/a/147893) von stats.stackexchange sollte auch helfen. [Dieser Beitrag] (http://stackoverflow.com/q/11546256/2572423) sollte sich ebenfalls als hilfreich erweisen - wir visualisieren grundsätzlich zwei individuelle Dichteplots auf einer Oberfläche. – JasonAizkalns

+1

sehr nützlich .. aber es führt mich zu dieser Frage: http://stackoverflow.com/questions/34939054/r-ggmap-countour-plot-convert-level-to-events-per-squared-area-of-distance – user1420372

7

Die stat_ Funktionen berechnen neue Werte und erstellen neue Datenrahmen. Dieser erstellt einen Datenrahmen mit einer level Variable. Sie können es sehen, wenn Sie ggplot_build vs Plotten die Grafik verwenden:

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 

Die ..level.. ggplot sagt, dass Spalte in dem neu errichteten Datenrahmen zu verweisen.

Unter der Motorhaube wird ggplot etwas Ähnliches zu tun (das ist keine Replikation davon 100%, da es unterschiedliche Plot Grenzen, etc. verwendet):

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 

Und auch contourLines rief die Polygone zu erhalten.

This ist eine anständige Einführung in das Thema. Sehen Sie sich auch in R help an.

+5

Danke. Aber welche Spalte ist ..level .. erstellt von dann? – uncool

+0

Danke, 'kde2d()' half mir, die Dichtekarte zu exportieren. – Matt

Verwandte Themen