在 r ggplot 的热图中裁剪地理边界
Crop geographical boundaries in a heatmap in r ggplot
我正在尝试在地理边界内裁剪热图(或“geom_tile”)。
我沿经度和纬度坐标为热图定义了一个随机数据框。
set.seed(20)
lon = seq(from = 3.4, to = 6.3, by = 0.1)
lat = seq(from = 13.3, to = 10.1, by = -0.1)
lati <- c()
long <- c()
for (i in 1:length(lat)) {
for (j in 1:length(lon)) {
lati <- c(lati,lat[i])
long <- c(long,lon[j])
}
}
vals = rnorm(length(lati))
df <- data.frame(
longitude=long,
latitude=lati,
value=vals)
然后我做地理边界,专门针对尼日利亚的凯比州。
library(raster)
library(sf)
nga <- getData('GADM', country='NGA', level=1)
keb <- subset(nga,NAME_1 %in% "Kebbi")
keb2 <- st_as_sf(keb)
然后我结合热图和地理边界:
library(ggplot2)
tilekeb <- ggplot() + geom_tile(data=df,aes(x=longitude,y=latitude,fill=vals),alpha=1/2,color="black",size=0) +
geom_sf(data = keb2, inherit.aes = FALSE, fill = NA)
这会产生:
我的目标是切掉(裁剪)边界外的部分,只留下受限地理边界内的热图。在 R/ggplot 中有人知道如何做到这一点吗?
谢谢
我实际上用 raster
来完成这项工作
# create spatial points data frame from your df
spg <- df
coordinates(spg) <- ~ longitude + latitude
# coerce to SpatialPixelsDataFrame
gridded(spg) <- TRUE
# coerce to raster
rasterDF <- raster(spg)
# then I crop
plot(rasterDF)
rasterDF_crop <- crop(rasterDF, extent(keb2))
plot(rasterDF_crop)
rasterDF_masked <- mask(rasterDF_crop, keb2)
plot(rasterDF_masked)
然后我将它转换回数据框:
df_masked <- raster::as.data.frame(rasterDF_masked,xy=TRUE)
colnames(df_masked) <- colnames(df)
并使用您的代码再次绘制它
library(ggplot2)
tilekeb <- ggplot() + geom_tile(data=df_masked,aes(x=longitude,y=latitude,fill=value),alpha=1/2,color="black",size=0) +
geom_sf(data = keb2, inherit.aes = FALSE, fill = NA)
tilekeb
我正在尝试在地理边界内裁剪热图(或“geom_tile”)。
我沿经度和纬度坐标为热图定义了一个随机数据框。
set.seed(20)
lon = seq(from = 3.4, to = 6.3, by = 0.1)
lat = seq(from = 13.3, to = 10.1, by = -0.1)
lati <- c()
long <- c()
for (i in 1:length(lat)) {
for (j in 1:length(lon)) {
lati <- c(lati,lat[i])
long <- c(long,lon[j])
}
}
vals = rnorm(length(lati))
df <- data.frame(
longitude=long,
latitude=lati,
value=vals)
然后我做地理边界,专门针对尼日利亚的凯比州。
library(raster)
library(sf)
nga <- getData('GADM', country='NGA', level=1)
keb <- subset(nga,NAME_1 %in% "Kebbi")
keb2 <- st_as_sf(keb)
然后我结合热图和地理边界:
library(ggplot2)
tilekeb <- ggplot() + geom_tile(data=df,aes(x=longitude,y=latitude,fill=vals),alpha=1/2,color="black",size=0) +
geom_sf(data = keb2, inherit.aes = FALSE, fill = NA)
这会产生:
我的目标是切掉(裁剪)边界外的部分,只留下受限地理边界内的热图。在 R/ggplot 中有人知道如何做到这一点吗?
谢谢
我实际上用 raster
来完成这项工作
# create spatial points data frame from your df
spg <- df
coordinates(spg) <- ~ longitude + latitude
# coerce to SpatialPixelsDataFrame
gridded(spg) <- TRUE
# coerce to raster
rasterDF <- raster(spg)
# then I crop
plot(rasterDF)
rasterDF_crop <- crop(rasterDF, extent(keb2))
plot(rasterDF_crop)
rasterDF_masked <- mask(rasterDF_crop, keb2)
plot(rasterDF_masked)
然后我将它转换回数据框:
df_masked <- raster::as.data.frame(rasterDF_masked,xy=TRUE)
colnames(df_masked) <- colnames(df)
并使用您的代码再次绘制它
library(ggplot2)
tilekeb <- ggplot() + geom_tile(data=df_masked,aes(x=longitude,y=latitude,fill=value),alpha=1/2,color="black",size=0) +
geom_sf(data = keb2, inherit.aes = FALSE, fill = NA)
tilekeb