2012-06-22 5 views
5

I einen Datenrahmen eine Anzahl von (x,y,z) Datenpunkten enthält, sind (x,y) die untere rechte eine Länge-Breite-Zelle der Größe w (zum Beispiel eines 1-Grad-Raster) Koordinaten . Der Wert z wurde über diese Zelle gemittelt.R Plot Filled Longitude-Latitude Gitterzellen auf der Karte

Ich möchte diese Punkte in R so plotten, dass die gesamte Gitterzelle mit einer Farbe gefüllt ist, die von z abgeleitet ist. so etwas wie eines dieser Bilder sehen

Das Ergebnis wäre: longitude-latitude grid cells filled

Die Projektion selbst (zum Beispiel Lambert konforme konische, equirectangular) ist nicht wichtig, nur die Rasterzelle Plotten.

Meine Daten sind spärlich: Nicht jeder Zelle mit Längen- und Breitengrad sind Daten zugeordnet.

Meine Hoffnung wäre eine Lösung ähnlich wie

library(maps) 
map("state") 
grid_points(my_data,c("x","y","z"),0.5) 

wobei 0,5 die Rasterauflösung oben ist, was auf eine 0,5-Grad-Zelle.

Irgendwelche Gedanken?

Danke!

+1

mir ein Vergnügen, @PaulHiemstra . Ihre Antwort war genau, was Sie suchen sollten, ich wollte nur ein bisschen mehr miteinander kombinieren. Vielen Dank für deine Hilfe. – Richard

Antwort

6

Eine alternative zu entweder spplot oder image verwenden ist ggplot2 zu verwenden. Die relevanten Geometrien sind geom_raster und geom_tile. Die erste soll besser funktionieren und kleinere Dateien liefern, und die zweite ist mehr Standard.Das folgende Beispiel Aufruf:

ggplot(aes(x = x, y = y, fill = value), data = dat_grid) + geom_tile() + 
    geom_path(data = ant_ggplot) 

entstammt aus this blogpost von mir. Darüber hinaus unterstützt ggplot2 eine Reihe von Projektionen durch das mapproj Paket, siehe coord_map für weitere Details.

Das Folgende ist ein Arbeitsbeispiel (vorausgesetzt, Sie haben YOUR_DATA definiert x haben, y, z Spalten):

library(ggplot2) 
library(maps) 
us_states <- map_data("state") 
(ggplot(aes(x=x,y=y,fill=z),data=YOUR_DATA) + geom_tile())+geom_polygon(data=us_states,aes(x=long, y=lat, group=group), colour="black", fill="white", alpha=0) 
3

Wenn Ihr data.frame ist „x“, versuchen Sie dies:

library(sp) 
coordinates(x) <- c("x", "y", "z") 
gridded(x) <- TRUE 
image(x, col = terrain.colors(256), useRaster = TRUE) 

eine genaue Um wirklich zu beantworten, sollten Sie eine Probe Ihrer Daten zur Verfügung stellen, die hoffentlich eine ganze data.frame oder die Quelle, wo Sie herunterladen und der Code, den Sie es in R. zu lesen verwendet, um

Wenn über den Code auf dem dann gridded()<- Schritt fehlschlägt, es ist wahrscheinlich, dass Ihre x und y Werte liefern nicht wirklich ein reguläres Gitter, die durch Ihre Plots implizierten. Wenn sie tatsächlich Gitterlängen-/Breitengradwerte sind und Sie sie zu den Bildern in Ihrem Bild projizieren müssen, dann sehen Sie sich das raster Paket an, oder allgemein das rgdal Paket.

library(raster) 
?projectRaster 

library(rgdal) 
?project 
?spTransform 

(Die Plots mir aussehen wie eine der "Albers Equal Area und Lambert Conformal Conic Projektionen von Nordamerika", wie auf dieser Seite gezeigt: http://www.colorado.edu/geography/gcraft/notes/mapproj/mapproj_f.html).

Siehe http://spatialreference.org, um die PROJ.4-Zeichenfolge für Ihre Projektion zu erhalten, die Sie in sp oder raster verwenden können.

+0

Die Projektion selbst ist nicht wichtig, nur die Rasterzellenplotting. Ich werde die Frage bearbeiten, um dies zu berücksichtigen. – Richard

+0

Meine Antwort ist immer noch relevant. Es funktioniert auch für spärliche Koordinaten, solange sie regulär sind. Ohne die Projektion oder irgendetwas über Ihre Daten zu wissen, können wir nur raten, und die Projektion ist sehr wichtig, bis Sie uns genug Details geben, um zu wissen, was Sie wirklich mit diesen Rasterlinien haben und wirklich wollen. – mdsumner

2

Ich habe versucht, diese Art von Karte und endete vor kurzem tun sich mit der Funktion interp der Bibliothek akima meiner z-Daten in einem regelmäßigen Gitter intrapolate vor dem Plotten (jede Art von Projektionen muss getan werden, vor der Verwendung von interp) :

library(akima) 
interp(x,y,z,xo=seq(min(x),max(x),by=0.5),yo=seq(min(y),max(y),by=0.5),extrap=FALSE,linear=TRUE) -> xygrid 
image(xygrid,breaks=seq(min(z),max(z),length=10), col=1:10) 
0

Sie können dies tun:

library(raster) 
r <- rasterFromXYZ(xyz) 
plot(r)