2012-06-24 12 views
15

Primo post qui, spero di osservare l'etichetta del sito web. Non sono riuscito a trovare e rispondere sul sito e in precedenza ho pubblicato questo messaggio su un gruppo specifico ggplot2, ma non ho ancora trovato soluzioni.ggplot2: il tracciamento raster non funziona come previsto quando si impostano valori alfa

Fondamentalmente sto provando a sovrapporre due raster utilizzando ggplot2 e richiede che quello superiore sia semitrasparente. Ho un raster hillShade che viene calcolato da un raster di dati di elevazione e desidero sovrapporre il raster di elevazione al raster hillshade in modo che la trama risultante non appaia "piatta". Puoi vedere cosa intendo nel codice R riproducibile qui sotto.

Utilizzando la grafica di base posso ottenere il risultato desiderato e ho incluso un esempio nel codice qui sotto per chiarire cosa intendo, ma ho bisogno di farlo in ggplot2.

Non riesco a farlo funzionare in ggplot2. La combinazione dei raster rende i colori divertenti (posso tracciare ognuno di essi da solo). Qualcuno può aiutarmi o indicarmi la giusta direzione. Esempio di codice autonomo e riproducibile incluso di seguito. (Ci scusiamo per la lunghezza, ma ho pensato che fosse meglio essere chiari).

# Load relevant libraries 
library(ggplot2) 
library(raster) 


# Download sample raster data of Ghana from my Dropbox 
oldwd <- getwd() 
tmp <- tempdir() 
setwd(tmp) 
url1 <- "http://dl.dropbox.com/s/xp4xsrjn3vb5mn5/GHA_HS.asc" 
url2 <- "http://dl.dropbox.com/s/gh7gzou9711n5q7/GHA_DEM.asc" 
f1 <- file.path(tmp,"GHA_HS.asc") 
f2 <- file.path(tmp,"GHA_DEM.asc") 
download.file(url1,f1) #File is ~ 5,655Kb 
download.file(url2,f2) #File is ~ 2,645Kb 


# Create rasters from downloaded files 
hs <- raster(f1) 
dem <- raster(f2) 


# Plot with base graphics to show desired output 
plot(hs,col=grey(1:100/100),legend=F) 
plot(dem,col=rainbow(100),alpha=0.4,add=T,legend=F) 


# Convert rasters TO dataframes for plotting with ggplot 
hdf <- rasterToPoints(hs); hdf <- data.frame(hdf) 
colnames(hdf) <- c("X","Y","Hill") 
ddf <- rasterToPoints(dem); ddf <- data.frame(ddf) 
colnames(ddf) <- c("X","Y","DEM") 


# Create vectors for colour breaks 
b.hs <- seq(min(hdf$Hill),max(hdf$Hill),length.out=100) 
b.dem <- seq(min(ddf$DEM),max(ddf$DEM),length.out=100) 


# Plot DEM layer with ggplot() 
p1 <- ggplot()+ 
    layer(geom="raster",data=ddf,mapping=aes(X,Y,fill=DEM))+ 
    scale_fill_gradientn(name="Altitude",colours = rainbow(100),breaks=b.dem)+ 
    scale_x_continuous(name=expression(paste("Longitude (",degree,")")),limits=c(-4,2),expand=c(0,0))+ 
    scale_y_continuous(name=expression(paste("Latitude (",degree,")")),limits=c(4,12),expand=c(0,0))+ 
    coord_equal() 
print(p1) 


# Plot hillShade layer with ggplot() 
p2 <- ggplot()+ 
    layer(geom="raster",data=hdf,mapping=aes(X,Y,fill=Hill))+ 
    scale_fill_gradientn(colours=grey(1:100/100),breaks=b.hs,guide="none")+ 
    scale_x_continuous(name=expression(paste("Longitude (",degree,")")),limits=c(-4,2),expand=c(0,0))+ 
    scale_y_continuous(name=expression(paste("Latitude (",degree,")")),limits=c(4,12),expand=c(0,0))+ 
    coord_equal() 
print(p2) 


# Try to plot both together with transparency on the DEM layer 
p3 <- ggplot(hdf)+ 
    geom_raster(aes(X,Y,fill=Hill))+ 
    scale_fill_gradientn(colours=grey(1:100/100),breaks=b.hs,guide="none")+ 
    scale_x_continuous(name=expression(paste("Longitude (",degree,")")),limits=c(-4,2),expand=c(0,0))+ 
    scale_y_continuous(name=expression(paste("Latitude (",degree,")")),limits=c(4,12),expand=c(0,0))+ 
    geom_raster(data=ddf,aes(X,Y,fill=DEM),alpha=I(0.4))+ 
    scale_fill_gradientn(name="Altitude",colours = rainbow(100),breaks=b.dem)+ 
    coord_equal() 
print(p3) 


# Cleanup downloaded files and return to previous wd 
unlink(tmp,recursive=T) 
setwd(oldwd) 

Le mie domande sono le seguenti:

Q1: Come posso fare gli strati di aspetto p3 come fanno quando tracciate con la grafica di base nell'esempio di cui sopra?

Q2: Come posso specificare in modo più preciso le scale dei colori in modo da non avere una ridicola legenda sull'RHS?

+0

sono sicuro che ci sarebbe qualche modo per utilizzare 'annotation_raster' - ma i miei tentativi sono stati infruttuosi finora. La ragione (come la vedo io) per il fallimento della stampa combinata sono le due chiamate a "scale_fill_gradientn' – mnel

+0

che è il punto cruciale. sembra che un 'ggplot' possa avere solo un'estetica' fill' estetica e una 'colorazione'.puoi ottenere qualcosa che funziona facendo del layer DEM un 'geom_point' con' color = DEM' e poi usando 'scale_colour_gradientn' invece di' scale_fill_gradientn', ma non sembra buono come il modo grafico di base. –

+0

Grazie per aver guardato il mio problema, entrambi! @mplourde - Penso che ggplot2 possa avere un riempimento estetico per strato, ma penso che dove c'è trasparenza alfa combina i colori usando un mix di colori additivo dove gli strati si sovrappongono. In qualche modo questo mix è diverso in ggplot2 rispetto alla grafica di base. Ci stavo pensando e penso che quello che devo fare è calcolare manualmente i colori dal relativo valore in scala di grigi nel raster hillShade (penso che questa sia la crominanza nel colore hcl modello) e la tonalità dal raster DEM (penso che questa sarebbe la tonalità). –

risposta

11

Q1: non è possibile avere scale di riempimento diverse su livelli diversi. Una soluzione alternativa è usare l'estetica di riempimento per DEM e l'estetica alfa per hillshade. Sfortunatamente, geom_raster non sembra usare l'estetica alfa come mi aspettavo. È possibile ottenere lo stesso effetto con geom_tile, ci vuole solo più a lungo:

ggplot(hdf) + 
    geom_raster(data=ddf,aes(X,Y,fill=DEM)) + 
    scale_fill_gradientn(name="Altitude",colours = rainbow(100),breaks=b.dem) + 
    geom_tile(aes(X,Y,alpha=Hill), fill = "grey20") + 
    scale_alpha(range = c(0, 0.5)) + 
    scale_x_continuous(name=expression(paste("Longitude (",degree,")")), 
    limits=c(-4,2),expand=c(0,0)) + 
    scale_y_continuous(name=expression(paste("Latitude (",degree,")")), 
    limits=c(4,12),expand=c(0,0)) + 
    coord_equal() 

Q2: Partenza ?guide_colorbar. Non funziona molto bene con le tue 100 interruzioni di colore, ma con meno è abbastanza buono.

ggplot(hdf)+ 
    geom_raster(data=ddf,aes(X,Y,fill=DEM))+ 
    scale_fill_gradientn(name="Altitude",colours = rainbow(20))+ 
    guides(fill = guide_colorbar()) + 
    geom_tile(aes(X,Y,alpha=Hill), fill = "grey20") + 
    scale_alpha(range = c(0, 0.5)) + 
    scale_x_continuous(name=expression(paste("Longitude (",degree,")")), 
    limits=c(-4,2),expand=c(0,0)) + 
    scale_y_continuous(name=expression(paste("Latitude (",degree,")")), 
    limits=c(4,12),expand=c(0,0)) + 
    coord_equal() 

DEM plus hill shading and colorbar legend

+0

molte grazie per il vostro tempo e impegno nel risolvere i miei sforzi di codifica. Questo funziona alla grande per i miei scopi. Grazie mille! :-) –

3

L'alfa nel raster sarà supportato nella prossima versione, in modo da poter trarre da:

ggplot(NULL, aes(X, Y)) + 
    geom_raster(data = ddf, aes(fill = DEM)) + 
    geom_raster(data = hdf, aes(alpha = Hill)) + 
    scale_fill_gradientn(name="Altitude",colours = rainbow(20))+ 
    guides(fill = guide_colorbar()) + 
    scale_alpha(range = c(0, 0.5), guide = "none") + 
    scale_x_continuous(name=expression(paste("Longitude (",degree,")")), limits=c(-4,2),expand=c(0,0)) + 
    scale_y_continuous(name=expression(paste("Latitude (",degree,")")), limits=c(4,12),expand=c(0,0)) + 
    coord_equal() 

in ogni caso, molto bella trama.

Se si desidera utilizzare questo subito, provare a installare da github:

library(devtools) 
install_github("ggplot2", "kohske", "fix/geom-raster-alpha") 

noti che geom_tile e geom_raster un aspetto diverso in alcuni dispositivi. Forse il raster è migliore per il tuo scopo.

enter image description here

+0

Grazie! Con questa correzione posso ora tracciare esattamente come ho bisogno. Grazie mille. Saluti, Simon. –

+0

Qualcuno ha idea di come è possibile regolare i colori nella legenda per abbinare i colori nella mappa ora che è mascherata da un grigio? – Dominik

+0

Si è verificato il problema del file-output (PDF) con "sfocato" raster quando si utilizza geom_raster() anziché geom_tile(). Quest'ultimo ha risolto il problema. Grazie per il commento. – Shadow

Problemi correlati