r - 将 stat_density_2d 输出裁剪为多边形
问题描述
我正在尝试使用 stat_density_2d() 函数创建基于 GPS 坐标的热图,并希望将输出裁剪为 ggplot() 中的多边形。这是一个例子:
x_coord <- c(-83, -82, -82, -83, -83)
y_coord <- c(41, 41, 42, 42, 41)
xy_coords <- cbind(x_coord, y_coord)
library(sp)
poly <- Polygon(xy_coords)
polys <- Polygons(list(poly), 1)
sp.polys <- SpatialPolygons(list(polys))
set.seed(2)
lon <- c(rnorm(20, -82.2, 0.1), rnorm(20, -82.1, 0.04))
lat <- c(rnorm(20, 41.2, 0.1), rnorm(20, 41.1, 0.02))
lon_lat <- data.frame(lon = lon,
lat = lat)
ggplot() +
geom_polygon(data = sp.polys, aes(x_coord, y_coord), fill = 'transparent', color = 'black') +
stat_density_2d(data = lon_lat, aes(x = lon, y = lat, fill = ..level.., alpha = 0.3), geom =
'polygon') +
scale_fill_gradientn(colours=rev(brewer.pal(7, "Spectral"))) +
scale_x_continuous(limits = c(-83.25, -81.75)) +
scale_y_continuous(limits = c(40.75, 42.25))
产生这个数字
有没有办法裁剪 stat_density 输出以删除正方形外的部分?非常感谢任何想法或建议。
解决方案
我无法找到将 stat_density_2d 输出裁剪为多边形的方法,但使用下面的代码可以掩盖多边形外部的区域。下面的代码假定您已经使用问题中发布的代码来创建多边形和 stat_density_2d 输出。
library(sp)
library(ggplot2)
library(RColorBrewer)
library(rgeos)
library(raster)
x_coord2 <- c(-83.2, -81.8, -81.8, -83.2, -83.2)
y_coord2 <- c(40.8, 40.8, 42.2, 42.2, 40.8)
xy_coords2 <- cbind(x_coord2, y_coord2)
poly2 <- Polygon(xy_coords2)
polys2 <- Polygons(list(poly2), 1)
sp.polys2 <- SpatialPolygons(list(polys2))
r <- raster(x = extent(sp.polys2))
res(r) <- 0.003
r <- setValues(r, 1)
r <- mask(r, sp.polys, inverse = T)
rdf <- data.frame(rasterToPoints(r))
ggplot() +
stat_density_2d(data = lon_lat, aes(x = lon, y = lat, fill = ..level..), alpha =
0.7, geom = 'polygon') +
scale_fill_gradientn(colours=rev(brewer.pal(7, "Spectral"))) +
scale_x_continuous(limits = c(-83.25, -81.75)) +
scale_y_continuous(limits = c(40.75, 42.25)) +
geom_tile(data = rdf, aes(x, y), fill = 'white') +
geom_polygon(data = sp.polys, aes(x_coord, y_coord), fill = 'transparent', color =
'black') +
theme_bw() +
theme(panel.grid.minor = element_blank(),
panel.grid.major = element_blank())
推荐阅读
- json - 使用 Spark 按行和列扩展 JSON 字符串
- javascript - 将原型传递给 Object.Create()
- typescript - 扩展现有验证器并仅设置一些选项
- chart.js - 如何在chartJS中将一个值与另一个值进行比较
- html - 带有表格布局的表格:在 Firefox 中固定 100% 高度
- c# - 在这种情况下如何使查找字段工作而不在数据库中定义外键?
- python - 如何使用python子进程输入管道
- flutter - Flutter:文本仅在点击按钮两次后更新
- amazon-web-services - AWS 中的 AMI 到底是什么?
- r - R中的内存问题“错误:无法分配大小为344 kb的向量”