2015-10-20 19 views
18

vorrei fare una trama utilizzando Studio R simile a quello qui sotto (creato nel Arc Mappa)Come impostare l'uso ggplot2 per mappare un raster

enter image description here

Ho provato il seguente codice:

# data processing 
library(ggplot2) 
# spatial 
library(raster) 
library(rasterVis) 
library(rgdal) 

# 
test <- raster(paste(datafold,'oregon_masked_tmean_2013_12.tif',sep="")) # read the temperature raster 
OR<-readOGR(dsn=ORpath, layer="Oregon_10N") # read the Oregon state boundary shapefile 

gplot(test) + 
    geom_tile(aes(fill=factor(value),alpha=0.8)) + 
    geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
       fill=NA,color="grey50", size=1)+ 
    coord_equal() 

L'output di tale codice simile a questo:

enter image description here

Un paio di cose da notare. Innanzitutto, gli shapefile spartiacque mancano nella versione R. questo va bene.

In secondo luogo, lo sfondo grigio più scuro nel grafico R è Nessun valore dati. In Arc, non vengono visualizzati, ma in R vengono visualizzati con gplot. Essi non vengono visualizzati quando uso 'plot' dal pacchetto raster:

plot(test) 

enter image description here

Le mie domande sono le seguenti:

  1. Come faccio a sbarazzarsi del grigio scuro NoData riempire nell'esempio "gplot"?
  2. Come impostare la legenda (colorbar) come ragionevole (come nelle legende 'trama' di ArcMap e raster?)
  3. Come si controlla la mappa di colori?

notare, ho provato molte versioni differenti di

scale_fill_brewer 
scale_fill_manual 
scale_fill_gradient 

e così via e così via, ma io ottenere gli errori, ad esempio

br <- seq(minValue(test), maxValue(test), len=8) 

gplot(test)+ 
geom_tile(aes(fill=factor(value),alpha=0.8)) + 

scale_fill_gradient(breaks = br,labels=sprintf("%.02f", br)) + 

geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
      fill=NA,color="grey50", size=1)+ 
coord_equal() 

Regions defined for each Polygons 
Error: Discrete value supplied to continuous scale 

Infine, una volta ho una soluzione per tracciare una di queste mappe, vorrei tracciare più mappe su una figura e creare una singola barra di colore per l'intero pannello (cioè una barra di colore per tutte le mappe) e vorrei poter controllare dove si trova la barra dei colori e la dimensione del col Orbar. Ecco un esempio di quello che posso fare con grid.arrange, ma non riesco a capire come impostare una singola barra colorata:

r1 <- test 
r2 <- test 
r3 <- test 
r4 <- test 

colr <- colorRampPalette(rev(brewer.pal(11, 'RdBu'))) 

l1 <- levelplot(r1, 
      margin=FALSE,      
      colorkey=list(
      space='bottom',     
      labels=list(at=-5:5, font=4), 
      axis.line=list(col='black')  
     ),  
      par.settings=list(
      axis.line=list(col='transparent') 
     ), 
      scales=list(draw=FALSE),    
      col.regions=viridis,     
      at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

l2 <- levelplot(r2, 
       margin=FALSE,      
       colorkey=list(
        space='bottom',     
        labels=list(at=-5:5, font=4), 
        axis.line=list(col='black')  
       ),  
       par.settings=list(
        axis.line=list(col='transparent') 
       ), 
       scales=list(draw=FALSE),    
       col.regions=viridis,     
       at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

l3 <- levelplot(r3, 
       margin=FALSE,      
       colorkey=list(
        space='bottom',     
        labels=list(at=-5:5, font=4), 
        axis.line=list(col='black')  
       ),  
       par.settings=list(
        axis.line=list(col='transparent') 
       ), 
       scales=list(draw=FALSE),    
       col.regions=viridis,     
       at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

l4 <- levelplot(r4, 
       margin=FALSE,      
       colorkey=list(
        space='bottom',     
        labels=list(at=-5:5, font=4), 
        axis.line=list(col='black')  
       ),  
       par.settings=list(
        axis.line=list(col='transparent') 
       ), 
       scales=list(draw=FALSE),    
       col.regions=viridis,     
       at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

grid.arrange(l1, l2, l3, l4,nrow=2,ncol=2) #use package gridExtra 

Il risultato è questo:

enter image description here

Lo shapefile e file raster sono disponibili al seguente link:

https://drive.google.com/open?id=0B5PPm9lBBGbDTjBjeFNzMHZYWEU

Molte grazie in anticipo.

devtools :: session_info() Informazioni sulla sessione ------------------------------------- -------------------------------------------------- ------------------------------ valore impostazione
versione R versione 3.1.1 (2014-07-10) sistema x86_64, darwin10.8.0
ui RStudio (0.98.1103)
lingua (EN)
fascicolazione en_US.UTF-8
tz America/Los_Angeles

Pacchetti --------------- -------------------------------------------------- -------------------------------------------------- ------ pacchetto * versione data origine
bitops 1.0-6 2013-08-17 CRAN (R 3.1.0) spazio colori 1.2-6 2015-03-11 CRAN (R 3.1.3) devtools 1.8 .0 2015-05-09 CRAN (R 3.1.3) digest 0.6.4 2013-12-03 CRAN (R 3.1.0) ggplot2 * 1.0.1 2015-03-17 CRAN (R 3.1.3) ggthemes * 2.1.2 2015-03-02 CRAN (R 3.1.3) git2r 0.10.1 2015-05-07 CRAN (R 3.1 .3) gridExtra 0.9.1 2012-08-09 CRAN (R 3.1.0) gtable 0.1.2 2012-12-05 CRAN (R 3.1.0) hexbin * 1.26.3 2013-12-10 CRAN (R 3.1.0) reticolo * 0.20-29 2014-04-04 CRAN (R 3.1.1) reticoloExtra * 0.6-26 2013-08-15 CRAN (R 3.1.0) magrittr 1.5 2014-11-22 CRAN (R 3.1.2) MASS 7.3-33 2014-05-05 CRAN (R 3.1.1) memoise 0.2.1 2014-04-22 CRAN (R 3.1.0) munsell 0.4.2 2013-07-11 CRAN (R 3.1.0) plyr 1.8.2 2015-04-21 CRAN (R 3.1.3) proto 0.3-10 2012-12-22 CRAN (R 3.1.0) raster * 2.2-31 2014-03-07 CRAN (R 3.1.0) rasterVis * 0.28 2014-03-25 CRAN (R 3.1.0) RColorBrewer * 1.0-5 2011-06- 17 CRAN (R 3.1.0) Rcpp 0.11.2 2014-06-08 CRAN (R 3.1.0) RCurl 1.95-4.6 2015-04-24 CRAN (R 3.1.3) rimodellare2 1.4.1 2014-12 -06 CRAN (R 3.1.2) rgdal * 0.8-16 2014-02-07 CRAN (R 3.1.0) rversions 1.0.0 2015-04-22 CRAN (R 3.1.3) scale * 0.2.4 2014-04-22 CRAN (R 3.1.0) sp * 1.0-15 2014-04-09 CRAN (R 3.1.0) stringi 0.4-1 2014-12-14 CRAN (R 3.1.2) stringr 1.0 .0 2015-04-30 CRAN (R 3.1.3) viridis * 0.3.1 2015-10-11 CRAN (R 3.2.0) XML 3,98-1,1 2013/06/20 CRAN (R 3.1.0) zoo 1,7-11 2014/02/27 CRAN (R 3.1.0)

+2

qual è il motivo che si desidera utilizzare ggplot per questo? – RobertH

+1

@RobertH Non mi sono impegnato a utilizzare ggplot, ma in generale mi piace ggplot e sto cercando di impararlo, quindi mi piacerebbe essere in grado di produrre grafici con ggplot in modo efficace. Per favore sentiti libero di condividere anche altre soluzioni. Grazie. –

+0

@hrbrmstr, per favore, identifica ciò che non funziona. Forse stai lottando con il fatto che ho incluso alcuni percorsi assoluti che ovviamente non funzioneranno sulla macchina di qualcun altro. Ho incluso un collegamento ai dati reali alla fine del mio messaggio. Se si inseriscono i dati in una cartella e si sostituiscono i percorsi con il percorso della cartella, dovrebbe funzionare. Non sono abbastanza abile con R per generare i dati da zero. –

risposta

9

Ecco come lo farei, con rasterVis::levelplot:

carico cose:

leggere le cose:

oregon <- readOGR('.', 'Oregon_10N') 
r <- raster('oregon_masked_tmean_2013_12.tif') 

Definire una palette di rampa di colori (o un vettore di colori con lunghezza 1 inferiore al numero di interruzioni per la scala di colori definita con l'argomento at riportato di seguito).

colr <- colorRampPalette(brewer.pal(11, 'RdYlBu')) 

cose Trama:

levelplot(r, 
      margin=FALSE,      # suppress marginal graphics 
      colorkey=list(
      space='bottom',     # plot legend at bottom 
      labels=list(at=-5:5, font=4)  # legend ticks and labels 
     ),  
      par.settings=list(
      axis.line=list(col='transparent') # suppress axes and legend outline 
     ), 
      scales=list(draw=FALSE),   # suppress axis labels 
      col.regions=colr,     # colour ramp 
      at=seq(-5, 5, len=101)) +   # colour ramp breaks 
    layer(sp.polygons(oregon, lwd=3))   # add oregon SPDF with latticeExtra::layer 

enter image description here

Si potrebbe effettivamente desidera il contorno leggenda (comprese le sue zecche) tracciata, nel qual caso aggiungere axis.line=list(col='black') alla lista dei colorkey args. Questo è necessario per sostituire la soppressione generale di scatole causata da par.settings=list(axis.line=list(col='transparent')):

levelplot(r, 
      margin=FALSE,      
      colorkey=list(
      space='bottom',     
      labels=list(at=-5:5, font=4), 
      axis.line=list(col='black')  
     ),  
      par.settings=list(
      axis.line=list(col='transparent') 
     ), 
      scales=list(draw=FALSE),    
      col.regions=colr,     
      at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3))     

enter image description here

Sono d'accordo con @hrbrmstr che viridis è spesso un better ramp to use, pur essendo - a mio parere - un po 'brutto . I principali vantaggi rispetto a qualcosa come Colordi ColorBrewer sono che i colori sono ancora distinti quando desaturati e le differenze di colore riflettono meglio le differenze nei valori. Credo che lo RdYlBu sia perfettamente accessibile per il daltonismo di Deuteranopia/Protanopia/Tritanopia.

Ecco la versione viridis:

library(viridis) 
levelplot(r, 
      margin=FALSE,      
      colorkey=list(
      space='bottom',     
      labels=list(at=-5:5, font=4), 
      axis.line=list(col='black')  
     ),  
      par.settings=list(
      axis.line=list(col='transparent') 
     ), 
      scales=list(draw=FALSE),    
      col.regions=viridis,     
      at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

enter image description here


EDIT

In risposta alla domanda aggiuntiva di OP, ecco come per tracciare più raster come richiesto.

Supponendo che tutti i raster abbiano la stessa estensione, risoluzione, proiezioni, ecc., È possibile impilarli in uno RasterStack e quindi utilizzare levelplot nello stack. È possibile passare width come elemento della lista passato a colorkey per controllare l'altezza della legenda ("larghezza" è un po 'contro-intuitiva, ma per impostazione predefinita le legende sono verticali). Se si desidera sopprimere le etichette delle strisce sopra ciascun pannello (come ho fatto di seguito - per impostazione predefinita sono etichettate con i nomi dei layer dello stack [vedere names(s)]), è possibile aggiungere strip.border e strip.background all'elenco passato a par.settings.

s <- stack(r, r*0.8, r*0.6, r*0.4) 
levelplot(s, 
      margin=FALSE,      
      colorkey=list(
      space='bottom',     
      labels=list(at=-5:5, font=4), 
      axis.line=list(col='black'), 
      width=0.75 
     ),  
      par.settings=list(
      strip.border=list(col='transparent'), 
      strip.background=list(col='transparent'), 
      axis.line=list(col='transparent') 
     ), 
      scales=list(draw=FALSE),    
      col.regions=viridis,     
      at=seq(-5, 5, len=101), 
      names.attr=rep('', nlayers(s))) +   
    layer(sp.polygons(oregon, lwd=3)) 

enter image description here

+0

Mi piace molto la soluzione di levelplot, anche se la mia domanda era specifica dell'uso di ggplot e/o gplot. Puoi modificare la tua soluzione per mostrare come posso tracciare quattro di queste mappe di temperatura in una sottotrama con una sola barra di colore lungo il fondo e controllare le dimensioni della barra di colore in modo che la barra di colore non sia altrettanto alta e si estende sul fondo della trama ? Sto aggiungendo un esempio di ciò che ho fatto usando grid.arrange al mio post originale in combinazione con la tua soluzione, ma vedrai che ci sono barre dei colori per ogni figura. –

+1

Un'altra soluzione per sopprimere i rettangoli delle etichette è utilizzando la funzione 'rasterTheme':' myTheme <- rasterTheme (region = viridis (n = 9)); myTheme $ axis.list $ col <- 'transparent''. Quindi si usa 'par.settings = myTheme' all'interno della chiamata' levelplot'. –

15
library(ggplot2) 
library(raster) 
library(rasterVis) 
library(rgdal) 
library(grid) 
library(scales) 
library(viridis) # better colors for everyone 
library(ggthemes) # theme_map() 

datafold <- "/path/to/oregon_masked_tmean_2013_12.tif" 
ORpath <- "/path/to/Oregon_10N.shp" 

test <- raster(datafold) 
OR <- readOGR(dsn=ORpath, layer="Oregon_10N") 

Lei non ha incluso tutto ciò che stava utilizzando per fare test così ho fatto questo:

test_spdf <- as(test, "SpatialPixelsDataFrame") 
test_df <- as.data.frame(test_spdf) 
colnames(test_df) <- c("value", "x", "y") 

E, allora è solo una questione di invio che + shapefile per ggplot2:

ggplot() + 
    geom_tile(data=test_df, aes(x=x, y=y, fill=value), alpha=0.8) + 
    geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
       fill=NA, color="grey50", size=0.25) + 
    scale_fill_viridis() + 
    coord_equal() + 
    theme_map() + 
    theme(legend.position="bottom") + 
    theme(legend.key.width=unit(2, "cm")) 

enter image description here

Funzionerà con qualsiasi scala di temperatura continua ora, tho. Viridis è solo uno dei migliori a venire in giro da molto tempo.

È possibile utilizzare il seguente se si deve usare gplot:

gplot(test) + 
    geom_tile(aes(x=x, y=y, fill=value), alpha=0.8) + 
    geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
       fill=NA, color="grey50", size=0.25) + 
    scale_fill_viridis(na.value="white") + 
    coord_equal() + 
    theme_map() + 
    theme(legend.position="bottom") + 
    theme(legend.key.width=unit(2, "cm")) 
+0

nessuna di queste soluzioni funziona per me. Per la prima soluzione, ottengo l'errore che "ggplot2 non sa come trattare i dati della classe RasterLayer", e per la soluzione 2 ottengo un errore per la theme_map "Errore: oggetto 'theme_map' non trovato". Ho caricato "ggthemes" –

+0

è semplicissimo farlo nei campi dei commenti SO (lo faccio frustrante tutto il tempo). aggiungi una 'library (ggthemes)' per il secondo numero (aggiornerò il post). per il primo ho trasformato il tuo oggetto 'test' in modo diverso. – hrbrmstr

+0

in realtà, ho avuto 'library (ggthemes)' nel post, è necessario farlo per 'theme_map' – hrbrmstr