R ggplot绘制圆形栅格Map-如何删除投影区域外的数据?

jm2pwxwz  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(150)

我试图在坐标系中绘制投影的栅格,该坐标系遵循地球曲率,就像大多数非WGS 84投影一样。问题是,地球仪包裹数据的地方不应绘制在地球之外。我知道ggplot不能绘制圆形/椭圆形图,但如何自动屏蔽或删除地球之外的数据?我必须绘制超过100张Map,我不能手动完成,特别是如果我想改变到一个不同的投影。
an answer here,但它的hackish,似乎并不适用于每一种情况,有函数或包,以处理这个问题?我不认为R用户只绘制Map在WGS 84?我附加了一个文件和代码,以快速绘制Map。我不能使用xlim,因为它会削减一些部分的Map,因为边界不直。

#netcdf file
https://ufile.io/fy08x33d
library(terra);library(tidyterra)
r=rast('Beck_KG_V1_present_0p5.tif')
#background map
r[r==0]=NA
ggplot() +geom_spatraster(data=r)+scale_fill_viridis_c(na.value='transparent') +coord_sf(crs=st_crs("+proj=hatano"),expand=FALSE)

i86rm4rw

i86rm4rw1#

有了这些数据

library(terra)
library(tidyterra)
r1 <- rast('Beck_KG_V1_present_0p5.tif')
r <- subst(r1, 0, NA)

你能做到

library(ggplot2)
p <- project(r, method="near", "+proj=hatano", mask=TRUE)
ggplot() +geom_spatraster(data=p)+scale_fill_viridis_c(na.value='transparent')

这里有两个备选方案
首先使用自己的调色板和图例

library(viridis)
g <- graticule(60, 45, "+proj=hatano")
plot(g, background="azure", mar=c(.2,.2,.2,4), lab.cex=0.5, col="light gray")
plot(p, add=TRUE, axes=FALSE, plg=list(shrink=.8), col=viridis(25))

使用文件附带的颜色:

coltab(p) <- coltab(r1)
plot(g, background="azure", mar=.5, lab.cex=0.5, col="light gray")
plot(p, add=TRUE, axes=FALSE, col=viridis(25))

6vl6ewon

6vl6ewon2#

这里我会选择Robert Hijman的一个选项,但是如果你想在ggplot中创建一个遮罩,你可以这样做:

library(grid)

y <- seq(0, 1, length = 100)
x <- ifelse(y < 0.5, 
            -cos(pi/2 * (2 * y - 1)) * 0.125 + 0.125,
            -cos(pi/2 * (2 * y - 1)) * 0.175 + 0.175)
y <- c(0, y, 1, 0)
x <- c(0, x, 0, 0)

ggplot() +
  geom_spatraster(data=r)+
  scale_fill_viridis_c(na.value = 'transparent') +
  coord_sf(crs = st_crs("+proj=hatano"), expand = FALSE) +
  annotation_custom(polygonGrob(x = x, y = y, 
                                      gp = gpar(col = "white", lwd = 1))) +
  annotation_custom(polygonGrob(x = 1-x, y = y, 
                                gp = gpar(col = "white", lwd = 1)))

相关问题