ggplot2: Beim Festlegen von Alpha-Werten funktioniert das Rasterplotten nicht wie erwartet

Erster Beitrag hier, ich hoffe, ich beobachte die Website-Etikette. Ich konnte auf der Website keine Antwort finden und habe dies zuvor in einer ggplot2-spezifischen Gruppe gepostet, aber noch keine Lösung gefunden.

Grundsätzlich versuche ich, mit ggplot2 zwei Raster zu überlagern, wobei das obere halbtransparent sein muss. Ich habe ein HillShade-Raster, das aus einem Höhendaten-Raster berechnet wird, und ich möchte das Höhen-Raster auf das HillShade-Raster legen, damit das resultierende Diagramm nicht "flach" aussieht. Sie können sehen, was ich im reproduzierbaren R-Code unten meine.

Mit Basisgrafiken kann ich das gewünschte Ergebnis erzielen, und ich habe ein Beispiel in den folgenden Code eingefügt, um zu verdeutlichen, was ich meine, aber ich muss dies in ggplot2 tun.

Ich kann es nicht in ggplot2 zum Laufen bringen. Durch das Kombinieren der Raster werden die Farben lustig (ich kann jedes für sich zeichnen). Kann mir jemand helfen oder in die richtige Richtung weisen. Eigenständiges, reproduzierbares Codebeispiel siehe unten. (Sorry für die Länge, aber ich dachte besser klar zu sein).

#   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)

Meine Fragen lauten wie folgt:

F1: Wie kann ich die Ebenen von p3 aussehen lassen, wenn sie im obigen Beispiel mit Basisgrafiken geplottet werden?

F2: Wie kann ich Farbskalen sinnvoller festlegen, damit ich keine lächerliche Legende auf dem RHS habe?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage