2014-12-19 8 views
10

Ich habe gelernt, ggplot2, und hoffe, es für alle meine R-Grafik verwenden. Ich habe jedoch noch keine Möglichkeit gefunden, ein Konturdiagramm zu erstellen, das einem herkömmlichen Konturdiagramm ähnelt, wie es mit gridt: fill.contour() erhalten werden kann. Zum Beispiel:Wie man ein ggplot2 Konturdiagramm analog zum Gitter macht: filled.contour()?

#define data 
x<-seq(1,11,1) 
y<-seq(1,11,1) 
xyz.func<-function(x,y) {-10.4+6.53*x+6.53*y-0.167*x^2-0.167*y^2+0.0500*x*y} 

#contour plot using lattice graphics and R Color Brewer 
library(lattice) #for filled.contour() 
library(RColorBrewer) #for brewer.pal() 
z.lattice<-outer(x,y,xyz.func) 
filled.contour(x,y,z.lattice,nlevels=6,col=brewer.pal(6,"YlOrRd")) 

Dies gibt mir eine schöne Kontur Plot.

enter image description here

Jetzt wollen wir die gleiche Sache in ggplot2 versuchen. Das Beste, was ich mit oben kommen kann, basierend auf alles, was ich gelesen habe (vor allem Drawing labels on flat section of contour lines in ggplot2) ist:

#contour plot using ggplot2 
library(ggplot2) 
library(reshape2) #for melt() 
z.molten<-melt(z.lattice) 
names(z.molten) <- c("x", "y", "z") 
v<-ggplot(z.molten, aes(x,y,z=z))+ 
    geom_tile(aes(fill=z))+ 
    stat_contour(bins=6,aes(x,y,z=z), color="black", size=0.6)+ 
    scale_fill_gradientn(colours=brewer.pal(6,"YlOrRd")) 
v 

Dieser Graph, der die gleiche Grundidee wie filled.contour hat(), aber die farbigen Fliesen nicht entsprechen zu den Konturen sehr gut.

enter image description here

habe ich die Größen der Fliesen mit wechselnden, entweder nicht erfolgreich gewesen.

Haben Sie Vorschläge, wie Sie die Ausgabe von ggplot2 näher an die Ausgabe von filled.contour() bringen?

+0

Danke, MrFlick, für das Hinzufügen der Graphen! – Wissenschaftler

+0

Danke für den Vorschlag, @jlhoward. Wenn ich versuche, geom = polygon mit stat_contour() zu verwenden, lande ich mit polygonalen Konturen, aber vielleicht benutze ich es falsch. Zum Beispiel 'ggplot (z.molten, aes (x, y, z = z)) + stat_contour (geom =" Polygon ", bins = 6, aes (x, y, z = z))' macht die Konturen polygonal. – Wissenschaftler

Antwort

13

Das Wesen der Frage, wie es scheint, ist wie ein Konturdiagramm in ggplot mit diskreten gefüllt Konturen zu erzeugen, anstatt kontinuierlichen Konturen, wie Sie den herkömmlichen Verwendung von geom_tile(...) Ansatz bekommen würden. Hier ist ein Weg.

x<-seq(1,11,.03)     # note finer grid 
y<-seq(1,11,.03) 
xyz.func<-function(x,y) {-10.4+6.53*x+6.53*y-0.167*x^2-0.167*y^2+0.0500*x*y} 
gg <- expand.grid(x=x,y=y) 
gg$z <- with(gg,xyz.func(x,y))  # need long format for ggplot 
library(ggplot2) 
library(RColorBrewer)    #for brewer.pal() 
brks <- cut(gg$z,breaks=seq(0,100,len=6)) 
brks <- gsub(","," - ",brks,fixed=TRUE) 
gg$brks <- gsub("\\(|\\]","",brks) # reformat guide labels 
ggplot(gg,aes(x,y)) + 
    geom_tile(aes(fill=brks))+ 
    scale_fill_manual("Z",values=brewer.pal(6,"YlOrRd"))+ 
    scale_x_continuous(expand=c(0,0))+ 
    scale_y_continuous(expand=c(0,0))+ 
    coord_fixed() 

Die Verwendung von beispielsweise scale_x_continuos(...) wird nur von dem zusätzlichen Platz ggplot puts um die Achsgrenzen loszuwerden; Gut für die meisten Dinge, aber ablenkend in Konturplots. Die Verwendung von coord_fixed(...) ist nur, um das Seitenverhältnis auf 1: 1 einzustellen. Diese sind optional.

+0

Perfekt, @jlhoward. Vielen Dank! – Wissenschaftler