2015-02-04 14 views
7

Ich möchte diese mit fill.contour() erstellte Figur plotten, aber in ggplot2, wie mache ich das?R plot filled.contour() Ausgabe in ggpplot2

Ich möchte ggplot2 verwenden, da die Konventionen für die grafische Darstellung einfacher sind. Der Grund, warum ich fill.contour() verwenden möchte, ist, weil ich geom_tile() und image.plot() probiert habe und beide sehr kachelartige Ausgaben erzeugt haben, und ich brauche eine Ausgabe, die fill.contour() ähnlich ist.

Dies ist meine Figur:

enter image description here

Code:

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 von Daten:

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

Ihre Daten Snippet enthält Duplikate und Ursachen "interp" Kopfschmerzen. Warum befestigen Sie auch 'df'? – hrbrmstr

+0

Ich kann die Duplikate wahrscheinlich irgendwie loswerden, aber zum Anhängen - nur weil mir das jemand gesagt hat. Also sollte ich nicht? – Roseanna

Antwort

1

ich aus dem ggplot2 website das Beispiel nahm.

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

Wo x und y sind Ihre Lang und Lat und z d13C

12

Sie können die Farben optimieren, wie Sie benötigen:

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

Sie können die pixelation reduzieren auf Kosten einer gewissen Verarbeitungszeit durch Erhöhen der Dichte der Interpolation:

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

und reduziert auch die Binweite:

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

HINWEIS: dass für eine spürbare wenige Sekunden auf einem anständigen Desktop-System knirschen wird. Auf meinem ziemlich bullige MacBook Pro war es:

user system elapsed 
    6.931 0.655 8.153 
+0

danke aber wie gesagt in der Frage, habe ich geom_tile vor und wieder mit deinem Code versucht, aber es ist zu pixelig. Irgendwelche Ideen, um es weniger pixelig zu machen? Prost – Roseanna

+0

Hallo @hbrmstr sehr gute Antwort, aber ich habe eine andere Frage. Ist es möglich, einen geom_path im interpolierten Feld hinzuzufügen? Ich kann nicht erfolgreich sein. – pacomet

2

Um Follow-up auf @ hrbrmstr-Minimal Beispiel können Sie auch ggplot2 berechnen „z“ für Sie:

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