ancora più veloce senza fortify
:
leggere il post originale qui di seguito per ulteriori informazioni
Da this blog entry ho scoperto che abbiamo può utilizzare i poligoni spaziali direttamente in 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))
Come affrontare velocità di stampa se avete solo bisogno di visualizzare qualcosa
Come descritto di seguito, tale tracciato potrebbe diventare molto lento con un gran numero di pixel. Pertanto, si potrebbe considerare di ridurre il numero di pixel (che nella maggior parte dei casi non riduce realmente la quantità di informazioni nella mappa) prima di convertirlo in poligoni. Pertanto, è possibile utilizzare raster::aggregate
per ridurre il numero di pixel a un importo ragionevole.
L'esempio mostra come il numero di pixel è diminuito di un ordine di 4 (cioè 2 * 2, orizzontalmente * verticalmente). Per ulteriori informazioni, vedere ?raster::aggregate
.
r <- aggregate(r, fact = 2)
# afterwards continue with rasterToPolygons(r)...
originale del messaggio:
Dopo un po ', ho trovato un modo per risolvere questo problema. Conversione del raster in poligoni! Questa idea è stata quindi implementata dopo Marc Needham's blog post.
Eppure, c'è un inconveniente: ggplot diventa molto lento con un gran numero di poligoni, che inevitabilmente si trovano ad affrontare. Tuttavia, è possibile velocizzare le cose eseguendo il tracciamento su un dispositivo png()
(o altro).
Ecco un esempio di codice:
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))
Questo si traduce in qualcosa di simile:

Grazie per questa risposta. Tuttavia, se si utilizzano le coordinate cartesiane, le proporzioni non vengono mantenute. Quindi, non è molto adatto per le applicazioni geografiche – loki
Prova ad aggiungere quanto segue: bm <- bm + coord_fixed (xlim = c (a, b), ylim = c (c, d), ratio = 1.3), dove a, b , c, d sono le estensioni del pannello di visualizzazione che hai selezionato. La chiave qui è impostare la razione su 1.3. – pdbentley
alternativamente basta aggiungere bm <- bm + coord_fixed (1.3). – pdbentley