web-dev-qa-db-fra.com

Comment définir l'utilisation de ggplot2 pour mapper un raster

Je voudrais faire un tracé en utilisant R studio similaire à celui ci-dessous (créé dans Arc Map)

enter image description here

J'ai essayé le code suivant:

# 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()

La sortie de ce code ressemble à ceci:

enter image description here

Quelques choses à noter. Tout d'abord, les fichiers de formes des bassins versants manquent dans la version R. c'est bon.

Deuxièmement, le fond gris plus foncé du tracé R correspond aux valeurs No Data. Dans Arc, ils ne s'affichent pas, mais dans R, ils s'affichent avec gplot. Ils ne s'affichent pas lorsque j'utilise 'plot' du package raster:

plot(test)

enter image description here

Mes questions sont les suivantes:

  1. Comment puis-je me débarrasser du remplissage NoData gris foncé dans l'exemple 'gplot'?
  2. Comment définir la légende (barre de couleurs) pour qu'elle soit raisonnable (comme dans les légendes ArcMap et raster 'plot'?)
  3. Comment contrôler la palette de couleurs?

A noter, j'ai essayé de nombreuses versions différentes de

scale_fill_brewer
scale_fill_manual
scale_fill_gradient

et ainsi de suite et ainsi de suite mais j'obtiens des erreurs, par exemple

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

Enfin, une fois que j'ai une solution pour tracer une de ces cartes, je voudrais tracer plusieurs cartes sur une figure et créer une seule barre de couleurs pour l'ensemble du panneau (c'est-à-dire une barre de couleurs pour toutes les cartes) et je voudrais contrôler où se trouve la barre de couleurs et la taille de la barre de couleurs. Voici un exemple de ce que je peux faire avec grid.arrange, mais je ne peux pas comprendre comment définir une seule barre de couleur:

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   

La sortie est la suivante:

enter image description here

Le fichier de formes et le fichier raster sont disponibles sur le lien suivant:

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

Merci d'avance.

devtools :: session_info () Informations sur la session ------------------------------------------ -------------------------------------------------- ------------------------- valeur de réglage
version R version 3.1.1 (2014-07-10) système x86_64, darwin10.8.0
ui RStudio (0.98.1103)
langue (EN)
collation en_US.UTF-8
tz America/Los_Angeles

Paquets ------------------------------------------------- -------------------------------------------------- ---------------------- package * source de date de version
bitops 1.0-6 2013-08-17 CRAN (R 3.1.0) espace colorimétrique 1.2-6 2015-03-11 CRAN (R 3.1.3) devtools 1.8.0 2015-05-09 CRAN (R 3.1 .3) résumer 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) lattice * 0.20-29 2014-04-04 CRAN (R 3.1.1) latticeExtra * 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) remodeler2 1.4.1 2014-12-06 CRAN (R 3.1.2) rgdal * 0.8-16 2014-02-07 CRAN (R 3.1.0) versions 1.0.0 2015-04-22 CRAN (R 3.1.3) échelles * 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)

32
mr. cooper

Voici comment je le ferais, avec rasterVis::levelplot:

Charger des choses:

library(rgdal)
library(rasterVis)
library(RColorBrewer)

Lisez les choses:

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

Définissez une palette de rampe de couleurs (ou un vecteur de couleurs dont la longueur 1 est inférieure au nombre de sauts pour la rampe de couleurs définie avec l'argument at ci-dessous).

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

Tracer des choses:

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

Vous pouvez en fait souhaiter que le contour de la légende (y compris ses graduations) soit tracé, auquel cas ajoutez axis.line=list(col='black') à la liste des arguments de colorkey. Ceci est nécessaire pour remplacer la suppression générale des cases causée par 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

Je suis d'accord avec @hrbrmstr que viridis est souvent un meilleure rampe à utiliser , bien qu'il soit - à mon avis - un peu moche. Les principaux avantages par rapport à quelque chose comme ColorBrewer RdYlBu sont que les couleurs sont toujours distinctes lorsqu'elles sont désaturées, et les différences de couleur reflètent mieux les différences de valeurs. Je crois que RdYlBu est parfaitement accessible pour le dalteranopie/protanopie/tritanopie daltonisme, cependant.

Voici la version 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


[~ # ~] modifier [~ # ~]

En réponse à la question supplémentaire d'OP, voici comment tracer plusieurs rasters comme demandé.

En supposant que tous les rasters ont la même étendue, résolution, projections, etc., vous pouvez les empiler dans un RasterStack, puis utiliser levelplot sur la pile. Vous pouvez passer width comme élément de la liste passée à colorkey pour contrôler la hauteur de la légende ("largeur" ​​est un peu contre-intuitif, mais par défaut les légendes sont verticales). Si vous souhaitez supprimer les étiquettes de bande au-dessus de chaque panneau (comme je l'ai fait ci-dessous - par défaut, elles sont étiquetées avec les noms de couches de la pile [voir names(s)]), vous pouvez ajouter strip.border Et strip.background À la liste passée à 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

19
jbaums
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") 

Vous n'avez pas inclus ce que vous utilisiez pour créer test alors j'ai fait ceci:

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

Et, alors il suffit d'envoyer + le fichier de formes à 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

Cela fonctionnera avec n'importe quelle échelle de température continue maintenant, tho. Viridis n'est que l'un des meilleurs à avoir vu le jour très longtemps.

Vous pouvez utiliser ce qui suit si vous devez utiliser 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"))
37
hrbrmstr

Voici la solution simple avec ggplot:

scale_fill_gradientn(colours = terrain.colors(4),limits=c(0,1),  
                 space = "Lab",name=paste("Probability \n"),na.value = NA)

Dans scale_fill_gradientn (devrait également fonctionner pour scale_file_gradient), définissez na.value = NA.

2
Mio_Mio_Mate