ggplot2 :растровое построение не работает должным образом при установке альфа-значений

Первый пост здесь, я надеюсь, что соблюдаю этикет веб-сайта. Я не смог найти и ответить на сайте, и ранее я разместил это в специальной группе ggplot2, но решений пока нет.

В основном я пытаюсь наложить два растра, используя ggplot2, и требую, чтобы верхний был полупрозрачным -. У меня есть растр отмывки, который вычисляется из растра данных высот, и я хочу наложить растр высот на растр отмывки, чтобы полученный график не выглядел «плоским». Вы можете увидеть, что я имею в виду, в воспроизводимом коде R ниже.

Используя базовую графику, я могу добиться желаемого результата, и я включил пример в код ниже, чтобы было понятно, что я имею в виду, но мне нужно сделать это в ggplot2.

Я не могу заставить его работать в ggplot2. Комбинирование растров делает цвета забавными (Я могу рисовать каждый по отдельности ). Может ли кто-нибудь помочь или указать мне в правильном направлении. Пример автономного воспроизводимого кода приведен ниже. (Извините за длину, но я решил, что лучше быть ясным ).

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

Мои вопросы заключаются в следующем:

Q1 :Как мне сделать так, чтобы слои p3 выглядели так, как если бы они были построены с использованием базовой графики в приведенном выше примере?

Q2 :Как мне более разумно указать цветовые шкалы, чтобы у меня не было нелепой легенды на RHS?

15
задан Gilles 'SO- stop being evil' 25 June 2012 в 22:10
поделиться