ggplot2: drukowanie rastrowe nie działa zgodnie z oczekiwaniami podczas ustawiania wartości alfa
Pierwszy post tutaj, mam nadzieję, że przestrzegam etykiety witryny. Nie mogłem znaleźć i odpowiedzieć na stronie, a wcześniej zamieściłem to na konkretnej grupie ggplot2, ale na razie żadnych rozwiązań.
Zasadniczo próbuję nałożyć dwa rastry za pomocą ggplot2 i wymagać, aby pierwszy był półprzezroczysty. Mam raster wzniesienia, który jest obliczany na podstawie rastra danych wysokościowych i chcę nałożyć raster elewacji na raster wzniesienia, aby wynikowy wykres nie wyglądał na „płaski”. Możesz zobaczyć, co mam na myśli w powtarzalnym kodzie R poniżej.
Korzystając z grafiki bazowej, mogę osiągnąć pożądany rezultat, a poniżej zamieszczam przykład w kodzie, aby wyjaśnić, co mam na myśli, ale muszę to zrobić w ggplot2.
Nie mogę go zmusić do działania w ggplot2. Łączenie rastrów sprawia, że kolory stają się zabawne (mogę sam wykreślić każdy z nich). Czy ktoś może mi pomóc lub wskazać mi właściwy kierunek. Samodzielny, powtarzalny przykład kodu zamieszczony poniżej. (Przepraszam za długość, ale myślałem, że lepiej być jasnym).
# 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)
Moje pytania są następujące:
P1: Jak mogę sprawić, aby warstwy p3 wyglądały tak, jak w przypadku wykresów bazowych w powyższym przykładzie?
P2: Jak mogę rozsądniej określić skale kolorów, więc nie mam absurdalnej legendy na RHS?