2015-11-04 9 views
8

Voglio tracciare una mappa con un raster che sovrappone una mappa di base di Google Maps in ggplot2. Pertanto, ho usato get_map() e insert_raster() come questo:Aggiungi raster alla mappa di base ggmap: imposta alpha (trasparenza) e riempi colore a inset_raster() in 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]) 

C'è la possibilità di impostare un alpha e cambiare il colore fill?

Il risultato assomiglia a questo: enter image description here

risposta

8

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:

Raster with an alpha on a ggmap base map

1

appena stato alla ricerca in questo io stesso. Il problema che ho incontrato è stato il tentativo di sovrapporre un'uscita ggmap con un raster è stato il seguente errore:

Error: geom_raster only works with Cartesian coordinates.

il lavoro intorno a questo problema è quello di utilizzare coord_cartesian() come segue:

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) 

Sono non so da dove viene il tuo r raster. per fare questo, è sufficiente convertire il raster r in un frame di dati e aggiungere i dati secondo le istruzioni di geom_raster(), assicurarsi che le coordinate siano lat/long (ad esempio la stessa della mappa).

Per rispondere alla tua domanda, tramite geom_raster() puoi manipolare alpha e fill.

Spero che questo aiuti.

btw questo lavoro intorno originariamente sollevata a questo link: https://groups.google.com/forum/embed/#!topic/ggplot2/nqzBX22MeAQ

+0

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

+0

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

+0

alternativamente basta aggiungere bm <- bm + coord_fixed (1.3). – pdbentley

Problemi correlati