2016-02-24 9 views
8

Ich versuche, mit ggplot2 ein Konturdiagramm zu zeichnen, und es erweist sich als etwas schwieriger, als ich mir vorgestellt habe. Mit Hilfe der iris Dataset Ich bin der Lage, dieses Grundstück zu produzieren:Konturniveaus, die variablen Ebenen in ggplot2 entsprechen

ggplot(iris, aes(x=Petal.Width, y=Petal.Length, fill=Sepal.Width)) + 
    stat_density2d(geom="polygon", aes(fill=..level..)) 

enter image description here

Mein Problem ist, dass ich nicht scheinen, um herauszufinden, wie kann eher auf Anzeigen- als die Dichtewerte -die rohe Sepal.Width Werte . Hier ist, was ich versucht habe:

ggplot(iris, aes(x=Petal.Width, y=Petal.Length, z=Sepal.Width)) + 
    geom_tile(aes(fill=Sepal.Width))+ 
    stat_contour(aes(colour=..level..)) 

Dies erzeugt eine besonders seltsame Fehlermeldung:

Warning message: 
Computation failed in `stat_contour()`: 
(list) object cannot be coerced to type 'double' 

Ich habe auch versucht diese:

ggplot(iris, aes(x=Petal.Width, y=Petal.Length, fill=Sepal.Width)) + 
    stat_density2d(geom="polygon", aes(fill=Sepal.Width)) 

Und schließlich diese:

ggplot(iris, aes(x=Petal.Width, y=Petal.Length, fill=Sepal.Width)) + 
    geom_tile() 

Kann jemand einen guten Weg zu Pro empfehlen ein Konturdiagramm in ggplot2 mit den Werten der Variablen selbst, die die Ebenen der Kontur erzeugen?

Vom stat_contour Beispiel AKTUALISIERT:

# Generate data 
library(reshape2) # for melt 
volcano3d <- melt(volcano) 
names(volcano3d) <- c("x", "y", "z") 

# Basic plot 
ggplot(volcano3d, aes(x, y, z = z)) + 
stat_contour(geom="polygon", aes(fill=..level..)) 

Arbeit groß und sieht gut aus. Aber wenn ich das genau auf die Iris Beispiel gelten etwa so:

ggplot(iris, aes(x=Petal.Width, y=Petal.Length, fill=Sepal.Width)) + 
    stat_contour(geom="polygon", aes(fill=..level..)) 

erhalte ich diese Fehlermeldung:

Warning message: 
Computation failed in `stat_contour()`: 
(list) object cannot be coerced to type 'double' 

Diese sind beide Datenrahmen mit ähnlicher Struktur, so kann ich nicht herausfinden, was anders ist zwischen den beiden verursacht dieses Problem.

+0

'stat_countour' ein rechteckiges Gitter von Werten muss (wie im volcano3d Beispiel). Wenn Sie irreguläre Daten haben, müssen Sie ein Modell auswählen, um eine Interpolation durchzuführen, um Werte für das Raster zu berechnen, das Sie zeichnen möchten. Der 'z'-Wert, den Sie für' stat_density2d' sehen, macht wirklich nichts. Eine Dichte sagt nur die gemeinsame Dichte (~ Häufigkeit) dieser Beobachtungspaare voraus. – MrFlick

Antwort

2

Die ultimative Lösung auf diese Weise Faktorisierung die für die Interpolation akima Paket zu verwenden, dann ist die ggplot2 für die endgültige Plotten. Dies ist die Methode I verwendet:

library(ggplot2) 
library(akima) 
library(dplyr) 

interpdf <-interp2xyz(interp(x=iris$Petal.Width, y=iris$Petal.Length, z=iris$Sepal.Width, duplicate="mean"), data.frame=TRUE) 

interpdf %>% 
    filter(!is.na(z)) %>% 
    tbl_df() %>% 
    ggplot(aes(x = x, y = y, z = z, fill = z)) + 
    geom_tile() + 
    geom_contour(color = "white", alpha = 0.05) + 
    scale_fill_distiller(palette="Spectral", na.value="white") + 
    theme_bw() 

enter image description here

3

versuchen, die fill in stat_density2d()

ggplot(iris, aes(x=Petal.Width, y=Petal.Length, fill=Sepal.Width)) + 
    stat_density2d(geom="polygon", aes(fill = factor(..level..))) 

enter image description here

+2

Dies erzeugt immer noch die Faktorstufen als Dichten und nicht als die tatsächlichen Werte von "Sepal.Width". Kannst du empfehlen, die Konturen durch die "Sepal.Width" -Werte einzustellen? – boshek

+1

Ich habe das gleiche Problem.Grundsätzlich möchte/kann ich 2 unabhängige Variablen darstellen und dann ** Konturlinien ** für die abhängige Variable verwenden. Es überrascht mich, dass dies nicht einfacher ist, da ggplot2 (zu Recht) so stark gegen 3D-Perspektivplots ist. –

Verwandte Themen