gpt4 book ai didi

r - ggplot2:设置 alpha 值时,光栅绘图无法按预期工作

转载 作者:行者123 更新时间:2023-12-03 20:39:29 26 4
gpt4 key购买 nike

第一次在这里发帖,我希望我正在遵守网站礼仪。我在网站上找不到并回答,我之前将此发布到 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 上有一个荒谬的传说?

最佳答案

Q1:你不能在不同的图层上有不同​​的填充比例。一种解决方法是对 DEM 使用填充美学,对山体阴影使用 alpha 美学。不幸的是,geom_raster似乎没有像我预期的那样使用 alpha 美学。您可以使用 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

关于r - ggplot2:设置 alpha 值时,光栅绘图无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11179666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com