2015-11-04 1 views
8

Je veux tracer une carte avec un raster superposant une carte de base GoogleMaps dans ggplot2. Par conséquent, je get_map() et insert_raster() comme ceci:Ajouter un raster à la carte de base ggmap: définir alpha (transparence) et remplir la couleur à inset_raster() dans ggplot2

library(ggplot2) 
library(ggmap) 

bm <- ggmap(get_map(location = "Bangkok", maptype = "hybrid")) 

bm + inset_raster(as.raster(r), xmin = [email protected][1], xmax = [email protected][2], 
        ymin = [email protected][3], ymax = [email protected][4]) 

Est-il possible de définir une alpha et changer la couleur fill?

Le résultat ressemble à ceci: enter image description here

Répondre

8

encore plus rapide sans fortify:

lire le message original ci-dessous pour plus d'informations

De this blog entry je trouve que nous peut utiliser des polygones spatiaux directement dans ggplot::geom_polygon()

r <- raster(system.file("external/test.grd", package="raster")) 
# just to make it reproducible with ggmap we have to transform to wgs84 
r <- projectRaster(r, crs = CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")) 

rtp <- rasterToPolygons(r) 

bm <- ggmap(get_map(location = bbox(rtp), maptype = "hybrid", zoom = 13)) 
bm + 
    geom_polygon(data = rtp, 
       aes(x = long, y = lat, group = group, 
        fill = rep(rtp$test, each = 5)), 
       size = 0, 
       alpha = 0.5) + 
    scale_fill_gradientn("RasterValues", colors = topo.colors(255)) 

Comment aborder comploter vitesse si vous avez juste besoin de visualiser quelque chose

Comme décrit ci-dessous, ce pourrait devenir très tracé lent avec un grand nombre de pixels. Par conséquent, vous pouvez envisager de réduire le nombre de pixels (ce qui dans la plupart des cas ne diminue pas vraiment la quantité d'informations dans la carte) avant de le convertir en polygones. Par conséquent, raster::aggregate peut être utilisé pour réduire le nombre de pixels à une quantité raisonnable.

L'exemple montre comment le nombre de pixels est diminué d'un ordre de 4 (c'est-à-dire 2 * 2, horizontalement * verticalement). Pour plus d'informations, voir ?raster::aggregate.

r <- aggregate(r, fact = 2) 
# afterwards continue with rasterToPolygons(r)... 

Original Post:

Après un certain temps, je l'ai trouvé un moyen de résoudre ce problème. Conversion du raster en polygones! Cette idée a ensuite été implémentée après Marc Needham's blog post.

Pourtant, il y a un inconvénient: ggplot devient vraiment lent avec un grand nombre de polygones, auxquels vous devrez inévitablement faire face. Cependant, vous pouvez accélérer les choses en traçant dans un appareil png() (ou autre).


Voici un exemple de code:

library(raster) 
library(ggplot2) 
library(ggmap) 

r <- raster(....) # any raster you want to plot 
rtp <- rasterToPolygons(r) 
[email protected]$id <- 1:nrow([email protected]) # add id column for join 

rtpFort <- fortify(rtp, data = [email protected]) 
rtpFortMer <- merge(rtpFort, [email protected], by.x = 'id', by.y = 'id') # join data 

bm <- ggmap(get_map(location = "Shanghai", maptype = "hybrid", zoom = 10)) 

bm + geom_polygon(data = rtpFortMer, 
        aes(x = long, y = lat, group = group, fill = layer), 
        alpha = 0.5, 
        size = 0) + ## size = 0 to remove the polygon outlines 
    scale_fill_gradientn(colours = topo.colors(255)) 

Il en résulte quelque chose comme ceci:

Raster with an alpha on a ggmap base map

1

vient d'être à la recherche en moi-même. La question que j'ai rencontré en essayant de superposer une sortie ggmap avec une trame a été l'erreur suivante:

Error: geom_raster only works with Cartesian coordinates.

le travail autour de ce problème est d'utiliser coord_cartesian() comme suit:

library(ggplot2) 
library(ggmap) 

bm <- ggmap(get_map(location = "Bangkok", maptype = "hybrid")) 

bm <- bm + geom_raster(...) # insert your raster here 

bm <- bm + coord_cartesian() 

plot(bm) 

Je suis Je ne sais pas d'où vient votre raster. pour que cela fonctionne, il suffit de convertir votre raster en un bloc de données et d'ajouter les données en fonction des instructions geom_raster(), assurez-vous que les coordonnées sont en lat/long (c'est-à-dire la même chose que la carte). Pour répondre à votre question, via geom_raster(), vous pouvez manipuler alpha et remplir.

Espérons que cela aide.

BTW ce travail autour a été soulevée à l'origine à ce lien: https://groups.google.com/forum/embed/#!topic/ggplot2/nqzBX22MeAQ

+0

Merci pour cette réponse. Cependant, si des coordonnées cartésiennes sont utilisées, le rapport d'aspect n'est pas conservé. Ainsi, il n'est pas très approprié pour les applications géographiques – loki

+0

Essayez d'ajouter ce qui suit: bm <- bm + coord_fixed (xlim = c (a, b), ylim = c (c, d), ratio = 1,3), où a, b , c, d sont les extensions du panneau de vue que vous avez sélectionné. La clé ici est de mettre la ration à 1.3. – pdbentley

+0

alternativement vous venez d'ajouter bm <- bm + coord_fixed (1.3). – pdbentley