2016-03-18 20 views
8

Sto provando a tracciare un raster spaziale usando ggplot2.mappa raster e ggplot che non si allinea in R

require(raster) 
require(ggplot2) 

dati download, carico come un raster usando il pacchetto raster. Maggiori dettagli su questo prodotto di dati possono essere trovati here. Quindi converti il ​​raster in punti in modo che giochi bene con ggplot.

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') 

Ora usare ggplot2 per fare una mappa, e porre sopra il raster.

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 

L'output è simile al seguente:

enter image description here

Come si può vedere, le cose quasi line up, ma non del tutto. tutto è spostato leggermente a destra. Che cosa potrebbe causare questo e come posso risolverlo?

+1

FYI, vedo lo stesso offset nella grafica di base se faccio 'library (mappe); Mappa ('usa'); trama (livello, aggiungi = VERO) '. – eipi10

+3

Sembra che il confine sia allineato con gli angoli inferiori sinistro della griglia. Se si desidera ottenere le posizioni x e y del contorno del bordo allineate con i punti medi, spostare le posizioni x su un intervallo di griglia di mezza x intervallo e su un intervallo di griglia di mezza a y. –

+1

In seguito a quanto detto da @ 42, i metadati del sito Web ORNL mostrano intervalli di estensione spaziale da -124,0 a -66,5 gradi lon e da 25,0 a 49,0 lat, mentre suppongo che l'impostazione predefinita per i raster ggplot2 sia quella di tracciare il relativo numero al suo punto medio. –

risposta

3

In seguito alla documentazione ORNL, il confine del grafico Ndep è in realtà allineato con gli angoli inferiori sinistro della griglia. Per ottenere le posizioni xey allineate con i punti medi (predefinito in ggplot), è necessario spostare le posizioni x di 1 intervallo di griglia. Poiché l'intervallo di griglia è di 0,5 gradi nel caso, ho sottratto mezzo grado dal mio vettore di coordinate x.

La soluzione a questo problema è stata suggerita da @ 42 nei commenti.

Quindi, come prima, scaricare i dati:

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') 

E cruciale, sottrazioni mezzo grado dalla x-vettore di coordinate.

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

Ora, andare avanti e la trama:

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 

tutti allineati! enter image description here

2

In base a ciò che 42 e colin dicono, l'ORNL fornisce un file che non è corretto. E probabilmente dovresti dirglielo. Il file ha:

xllcorner -124 
yllcorner 25 

Qualora apparentemente dovrebbe essere:

xllcorner -124.5 
yllcorner 25 

Se è così, questo significa che il file attualmente specifica la coordinate come i bordi della cella, e la y coordinate come centri cellulari. Non va bene per nessuno degli standard. Esistono formati in cui è possibile avere sia x che y rappresentare i bordi delle celle anziché i centri cellulari, ma non uno dei due; e in entrambi i casi, nel formato file usato (arc-ascii) questo non è permesso.

Un buon modo per correggere questo errore, è quello di utilizzare shift dopo la creazione della RasterLayer:

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

e poi procedere.Questa è una soluzione più generica in quanto consente di utilizzare correttamente i dati raster per scopi diversi rispetto a ggplotting.

+0

grazie per la risposta! Solo così capisco perfettamente - sia la proiezione del raster quando lo converto in punti, sia il raster originale che viene spostato? Chiedo perché estraggo i dati dal raster per determinati siti usando le coordinate GPS x/y. Questa estrazione di dati sarà disattivata senza prima eseguire questa correzione? – colin

+1

Il raster originale viene spostato. Dopo averlo corretto, i punti dovrebbero andare bene; e l'estrazione dovrebbe essere OK (e in effetti sbagliata senza lo spostamento). – RobertH

+0

Questo non sembra funzionare fuori dalla scatola. Ricevo l'errore: 'Errore nello spostamento (ndep.ORNL, -0.5, 0): x deve essere un elenco, data.frame o data.table' – colin

Problemi correlati