Je voudrais faire un tracé en utilisant R studio similaire à celui ci-dessous (créé dans Arc Map)
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:
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)
Mes questions sont les suivantes:
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:
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)
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
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))
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))
[~ # ~] 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))
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"))
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"))
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.