2016-03-18 11 views
8

Ich versuche ein räumliches Raster mit ggplot2 zu plotten.raster und ggplot map nicht ganz in reihenfolge R

require(raster) 
require(ggplot2) 

Daten herunterladen, Last als Raster des raster Paket. Weitere Details zu diesem Datenprodukt finden Sie unter here. Dann wandle das Raster in Punkte um, so dass es gut mit ggplot spielt.

system('wget https://www.dropbox.com/s/7jsdqgc9wjcdznv/NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt') 
layer<- raster("path/to/raster/NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt") #you need to specify your own path here, wherever the downloaded file is saved. 
raster.points <- rasterToPoints(layer) 
raster.points <- data.frame(raster.points) 
colnames(raster.points) <-c('x','y','layer') 

Jetzt ggplot2 verwenden, um eine Karte zu machen, und legen Sie das Raster über.

mp <- NULL 
#grab US map and choose colors 
map.US <- borders("usa", colour='white',fill='black', lwd=0.4) 
mp <- ggplot(data=raster.points, aes(y=y, x=x)) 
mp <- mp + map.US 
mp <- mp + geom_raster(aes(fill=layer)) 
mp <- mp + theme(axis.text.y=element_blank(), 
       axis.text.x=element_blank(), 
       axis.title.y=element_blank(), 
       axis.title.x=element_blank(), 
       axis.ticks=element_blank(), 
       panel.background = element_rect(fill='black'), 
       plot.background = element_rect(fill='black'), 
       panel.grid.major=element_blank(), 
       panel.grid.minor=element_blank()) 
mp 

Die Ausgabe sieht wie folgt aus:

enter image description here

Wie Sie sehen können, die Dinge fast Linie, aber nicht ganz. alles ist leicht nach rechts verschoben. Was kann das verursachen und wie kann ich es beheben?

+1

FYI, ich sehe den gleichen Offset in der Basisgrafik, wenn ich 'Bibliothek (Karten); Karte ('USA'); plot (Ebene, add = TRUE) '. – eipi10

+3

Es sieht so aus, als ob die Grenze mit den unteren linken Ecken des Rasters gesäumt ist. Wenn Sie die X- und Y-Positionen der Umrandungslinie mit den Mittelpunkten ausrichten möchten, verschieben Sie die X-Positionen um ein halbes x Gitterintervall und um ein halbes y Gitterintervall nach oben. –

+1

Im Anschluss an das, was @ 42 sagte, zeigen die Metadaten von der ORNL-Website die räumlichen Ausdehnung Bereiche von -124,0 bis -66,5 Grad lon und 25,0 bis 49,0 Lat, während ich denke, der Standard für ggplot2 Rastern ist die Kachel relativ zu plotten zu seiner Mitte. –

Antwort

3

Nach der ORNL-Dokumentation ist die Grenze des Ndep-Diagramms tatsächlich mit den unteren linken Ecken des Gitters ausgerichtet. Um die x- und y-Positionen mit den mittleren Punkten auszurichten (Standard in ggplot), müssen Sie die x-Positionen um 1 Gitterintervall verschieben. Da das Gitterintervall in diesem Fall 0,5 Grad beträgt, subtrahierte ich einen halben Grad von meinem x-Koordinatenvektor.

Die Lösung für dieses Problem wurde von @ 42 in den Kommentaren vorgeschlagen.

So, wie vor, laden Sie die Daten:

system('wget https://www.dropbox.com/s/7jsdqgc9wjcdznv/NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt') 
layer<- raster("path/to/raster/NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt") #you need to specify your own path here, wherever the downloaded file is saved. 
raster.points <- rasterToPoints(layer) 
raster.points <- data.frame(raster.points) 
colnames(raster.points) <-c('x','y','layer') 

Und entscheidend ist, einen halben Grad von der x-Vektor der Koordinaten subtrahieren.

raster.points$x <- raster.points$x - 0.5 

Nun gehen Sie vor und Grundstück:

mp <- NULL 
#grab US map and choose colors 
map.US <- borders("usa", colour='white',fill='black', lwd=0.4) 
mp <- ggplot(data=raster.points, aes(y=y, x=x)) 
mp <- mp + map.US 
mp <- mp + geom_raster(aes(fill=layer)) 
mp <- mp + theme(axis.text.y=element_blank(), 
       axis.text.x=element_blank(), 
       axis.title.y=element_blank(), 
       axis.title.x=element_blank(), 
       axis.ticks=element_blank(), 
       panel.background = element_rect(fill='black'), 
       plot.background = element_rect(fill='black'), 
       panel.grid.major=element_blank(), 
       panel.grid.minor=element_blank()) 
mp 

alle aufgereiht! enter image description here

2

Basierend auf was 42 und Colin sagen, bietet das ORNL eine Datei, die nicht korrekt ist. Und Sie sollten ihnen wahrscheinlich davon erzählen. Die Datei hat:

xllcorner -124 
yllcorner 25 

Wo es sollte offensichtlich sein:

xllcorner -124.5 
yllcorner 25 

Wenn ja, das bedeutet, dass die Datei zur Zeit der x-Koordinaten als Zellenkanten angibt und die y-Koordinaten als Zellzentren. Das ist in keinster Weise gut. Es gibt Formate, in denen Sie sowohl x als auch y Zellkanten anstelle von Zellzentren darstellen können, aber nicht eine der beiden; In beiden Fällen ist dies im verwendeten Dateiformat (arc-ascii) nicht erlaubt.

Eine gute Möglichkeit, diesen Fehler zu korrigieren, ist shift zu verwenden, nachdem die RasterLayer erstellt:

layer < raster("NADP_wet_deposition_nh4_0.5x0.5_grid_annual_R1.txt") 
layer <- shift(layer, -0.5, 0) 

und dann fortzufahren.Dies ist eine allgemeinere Lösung, da die Rasterdaten für andere Zwecke als ggplotting korrekt verwendet werden können.

+0

danke für die Antwort! Nur so verstehe ich vollständig - sowohl die Projektion des Rasters, wenn ich es in Punkte umwandele, und das ursprüngliche Raster sind verschoben? Ich frage, weil ich Daten aus dem Raster für bestimmte Standorte mit x/y GPS-Koordinaten extrahiere. Wird diese Datenextraktion ohne diese Korrektur zuerst deaktiviert? – colin

+1

Das ursprüngliche Raster ist verschoben. Nachdem Sie es korrigiert haben, sollten die Punkte gut sein; und die Extraktion sollte in Ordnung sein (und in der Tat falsch ohne die Verschiebung). – RobertH

+0

Dies scheint nicht aus der Box zu funktionieren. Ich erhalte den Fehler: 'Fehler in der Schicht (ndep.ORNL, -0.5, 0): x muss eine Liste sein, data.frame oder data.table' – colin