Ggplot2: растровое построение не работает должным образом при настройке альфа-значений
Первое сообщение здесь, я надеюсь, что соблюдаю этический этикет. Я не мог найти и ответить на сайт, и ранее я разместил его в группе ggplot2, но пока нет решений.
В основном я пытаюсь наложить два растра, используя ggplot2 и требуя, чтобы верхняя часть была полупрозрачной. У меня есть растр hillShade, который вычисляется с растра данных высоты, и я хочу наложить растровый растровый растровый растр на растровый холм, чтобы получившийся участок не выглядел "плоским". Вы можете видеть, что я имею в виду в воспроизводимом 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?
Ответы
Ответ 1
Q1: у вас не может быть разных масштабов заполнения на разных уровнях. Одним из способов решения этой проблемы является использование эстетики заполнения для DEM и альфа-эстетики для hillshade. К сожалению, geom_raster
, похоже, не использует альфа-эстетику, как я ожидал. Вы можете получить тот же эффект с помощью geom_tile
, это займет больше времени:
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: Проверьте ?guide_colorbar
. Это не очень хорошо работает с вашими 100 цветовыми перерывами, но с меньшим количеством довольно хороших.
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]()
Ответ 2
Альфа в растрове будет поддерживаться в следующей версии, поэтому вы можете рисовать по:
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()
в любом случае, очень красивый сюжет.
Если вы хотите использовать это немедленно, попробуйте установить из github:
library(devtools)
install_github("ggplot2", "kohske", "fix/geom-raster-alpha")
Обратите внимание, что geom_tile
и geom_raster
выглядят по-разному в некоторых устройствах.
Возможно, растер лучше для вашей цели.
![enter image description here]()