2015-02-04 13 views
7

Voglio tracciare questa figura creata con filled.contour(), ma in ggplot2, come faccio?R plot filled.contour() output in ggpplot2

Voglio utilizzare ggplot2 perché le convenzioni grafiche sono più semplici. Il motivo per cui voglio usare filled.contour() è perché ho provato geom_tile() e image.plot() ed entrambi hanno creato output simili a tile e ho bisogno di un output simile a filled.contour().

Questa è la mia figura:

enter image description here

Codice:

library(akima) 

df <-read.table("Petra_phytoplankton+POM_xydata_minusNAs_noduplicates.txt",header=T) 
attach(df) 
names(df) 
fld <- with(df, interp(x = longitude, y = latitude, z = d13C)) 

filled.contour.ungeoreferenced <- 
    (filled.contour(x = fld$x, 
        y = fld$y, 
        z = fld$z, 
        color.palette = 
        colorRampPalette(c("blue", "green", "yellow", 
             "orange", "red")), 
        xlab = "Longitude", 
        ylab = "Latitude", 
        key.title = title(main = "d13C", 
            cex.main = 1))) 

Snippet dei dati:

latitude longitude d13C 
-65 -70 -27.7 
-61 150 -32.2 
-61 150 -28.3 
-60 116 -26.8 
-60 116 -24.7 
-47 38 -24.8 
-38 150 -20.5 
19 -65.7 -19.9 
19 -65.5 -18.5 
18 -60.7 -20 
18 -58.5 -18.2 
18 -57.8 -19 
17 -55.4 -18.6 
17 -50.8 -18 
17 -47.1 -18.3 
17 -45.5 -19.4 
16 -43.3 -17.9 
15 -40.7 -18.5 
14 -39.3 -19.9 
12 -36.7 -19.9 
12 -36.2 -19.9 
11 -34.4 -19.2 
10 -32 -18.5 
9 -30.3 -19.3 
8 -29.2 -19.4 
7 -26.6 -18.2 
7 -25.5 -19.3 
6 23.9 -20 
3 -21.3 -20.4 
+0

I Suoi dati snippet contiene i duplicati e le cause 'mal di testa interp'. Inoltre, perché stai allegando 'df'? – hrbrmstr

+0

Probabilmente mi libererò dei duplicati in qualche modo, ma per quanto riguarda il collegamento - solo perché è quello che qualcuno mi ha detto di fare. Quindi non dovrei? – Roseanna

risposta

1

ho preso l'esempio dalla ggplot2 website.

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

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

dove X e Y sono la vostra lunga e Lat ez è d13C

12

È possibile modificare i colori di cui hai bisogno:

gdat <- interp2xyz(fld, data.frame=TRUE) 

ggplot(gdat) + 
    aes(x = x, y = y, z = z, fill = z) + 
    geom_tile() + 
    coord_equal() + 
    geom_contour(color = "white", alpha = 0.5) + 
    scale_fill_distiller(palette="Spectral", na.value="white") + 
    theme_bw() 

enter image description here

è possibile ridurre il pixelation al costo di un tempo di elaborazione aumentando la densità dell'interpolazione:

fld <- with(df, interp(x = longitude, 
         y = latitude, 
         z = d13C, 
         xo = seq(min(longitude), max(longitude), length=400), 
         duplicate="mean")) 

e anche riducendo la larghezza bin:

ggplot(gdat) + 
    aes(x = x, y = y, z = z) + 
    geom_tile(aes(fill=z)) + 
    coord_equal() + 
    stat_contour(aes(fill=..level..), geom="polygon", binwidth=0.005) + 
    geom_contour(color="white", alpha=0.5) + 
    scale_fill_distiller(palette="Spectral", na.value="white") + 
    theme_bw() 

enter image description here

NOTA: che sta andando a sgranocchiare per evidenti alcuni secondi su un sistema desktop decente. Sul mio abbastanza robusto MacBook Pro era:

user system elapsed 
    6.931 0.655 8.153 
+0

grazie ma come ho detto nella domanda, ho provato geom_tile prima e di nuovo con il tuo codice, ma è troppo pixelato. Qualche idea per renderla meno pixellata? Saluti – Roseanna

+0

Ciao @hbrmstr ottima risposta, ma ho un'altra domanda. È possibile aggiungere un percorso geom sul campo interpolato? Non posso avere successo – pacomet

2

a dare seguito alle @ di hrbrmstr esempio minimo, si può anche avere compute ggplot2 "z" per voi:

library(ggplot2) 
ggplot(data = faithful, aes(x = eruptions, y = waiting)) + 
    stat_density2d(aes(colour = ..level.., fill = ..level..), geom = "polygon")