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:
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
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
alternativement vous venez d'ajouter bm <- bm + coord_fixed (1.3). – pdbentley