2016-02-24 20 views
8

Sto provando a disegnare la trama del contorno con ggplot2 e si sta rivelando un po 'più difficile di quanto immaginassi. Utilizzando il iris set di dati sono in grado di produrre questa trama:Livelli del profilo corrispondenti ai livelli variabili in ggplot2

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

enter image description here

Il mio problema è che io non riesco a capire come Display- piuttosto che i valori di densità -il prime Sepal.Width valori . Ecco quello che ho provato:

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

Ciò produce un messaggio di errore particolarmente strano:

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

Ho provato anche questo:

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

E infine questo:

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

Qualcuno può consigliare un buon modo per pro duce un grafico di contorno in ggplot2 con i valori della variabile stessa che producono i livelli del contorno?

AGGIORNATO

Dall'esempio stat_contour:

# 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..)) 

lavoro grande e ha un bell'aspetto. Ma se applico questo esattamente l'esempio iride in questo modo:

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

ricevo questo messaggio di errore:

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

Questi sono entrambi dataframes con struttura simile, quindi non riesco a capire ciò che è diverso tra i due causa di questo problema.

+0

'stat_countour' bisogno di una griglia rettangolare di valori (come nell'esempio volcano3d). se si dispone di dati irregolari, sarà necessario scegliere un modello per eseguire una qualche forma di interpolazione per calcolare i valori per la griglia che si desidera tracciare. Il valore 'z' che stai vedendo per' stat_density2d' in realtà non sta facendo nulla. Una densità predice solo la densità articolare (~ frequenza) di quelle coppie di osservazioni. – MrFlick

risposta

2

La soluzione definitiva a questo modo di usare il pacchetto akima per interpolazione allora il ggplot2 per tracciato finale. Questo è il metodo che ho usato:

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

Prova fattorizzare la 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

Questo produce ancora i livelli di fattore come densità piuttosto che i valori effettivi di 'Sepal.Width'. Puoi consigliare come impostare i livelli del contorno con i valori di 'Sepal.Width'? – boshek

+1

Ho lo stesso problema.Fondamentalmente, voglio/devo essere in grado di tracciare 2 variabili indipendenti, quindi usare ** curve di livello ** per la variabile dipendente. Mi sorprende che questo non sia più facile da eseguire, dal momento che ggplot2 è (giustamente) così fortemente contro i trame di prospettiva 3D. –