r - 使用 ggplot2 在点周围创建阴影多边形
问题描述
我昨天看到了这张美丽的美国麦当劳餐厅地图。我想为法国复制它(我发现了一些可以在这里下载的数据)。
我没有问题绘制点:
library(readxl)
library(ggplot2)
library(raster)
#open data
mac_do_FR <- read_excel("./mcdo_france.xlsx")
mac_do_FR_df <- as.data.frame(mac_do_FR)
#get a map of France
mapaFR <- getData("GADM", country="France", level=0)
#plot dots on the map
ggplot() +
geom_polygon(data = mapaFR, aes(x = long, y = lat, group = group),
fill = "transparent", size = 0.1, color="black") +
geom_point(data = mac_do_FR_df, aes(x = lon, y = lat),
colour = "orange", size = 1)
我尝试了几种方法(泰森多边形、热图、缓冲区),但我得到的结果很差。我无法弄清楚美国地图上的阴影多边形是如何绘制的。任何指针?
解决方案
这是我的结果,但确实需要一些手动数据处理。
第 1 步:获取地理空间数据。
library(sp)
# generate a map of France, along with a fortified dataframe version for ease of
# referencing lat / long ranges
mapaFR <- raster::getData("GADM", country="France", level=0)
map.FR <- fortify(mapaFR)
# generate a spatial point version of the same map, defining your own grid size
# (a smaller size yields a higher resolution heatmap in the final product, but will
# take longer to calculate)
grid.size = 0.01
points.FR <- expand.grid(
x = seq(min(map.FR$long), max(map.FR$long), by = grid.size),
y = seq(min(map.FR$lat), max(map.FR$lat), by = grid.size)
)
points.FR <- SpatialPoints(coords = points.FR, proj4string = mapaFR@proj4string)
第二步:根据店铺位置生成voronoi图,获取对应的多边形作为SpatialPolygonsDataFrame对象。
library(deldir)
library(dplyr)
voronoi.tiles <- deldir(mac_do_FR_df$lon, mac_do_FR_df$lat,
rw = c(min(map.FR$long), max(map.FR$long),
min(map.FR$lat), max(map.FR$lat)))
voronoi.tiles <- tile.list(voronoi.tiles)
voronoi.center <- lapply(voronoi.tiles,
function(l) data.frame(x.center = l$pt[1],
y.center = l$pt[2],
ptNum = l$ptNum)) %>%
data.table::rbindlist()
voronoi.polygons <- lapply(voronoi.tiles,
function(l) Polygon(coords = matrix(c(l$x, l$y),
ncol = 2),
hole = FALSE) %>%
list() %>%
Polygons(ID = l$ptNum)) %>%
SpatialPolygons(proj4string = mapaFR@proj4string) %>%
SpatialPolygonsDataFrame(data = voronoi.center,
match.ID = "ptNum")
rm(voronoi.tiles, voronoi.center)
步骤 3。检查地图上每个点与哪个 voronoi 多边形重叠,并计算其到相应最近商店的距离。
which.voronoi <- over(points.FR, voronoi.polygons)
points.FR <- cbind(as.data.frame(points.FR), which.voronoi)
rm(which.voronoi)
points.FR <- points.FR %>%
rowwise() %>%
mutate(dist = geosphere::distm(x = c(x, y), y = c(x.center, y.center))) %>%
ungroup() %>%
mutate(dist = ifelse(is.na(dist), max(dist, na.rm = TRUE), dist)) %>%
mutate(dist = dist / 1000) # convert from m to km for easier reading
第 4 步。绘图,根据需要调整填充渐变参数。我觉得平方根变换的结果对于强调商店附近的距离看起来相当不错,而对数变换则过于夸张,但您的里程可能会有所不同。
ggplot() +
geom_raster(data = points.FR %>%
mutate(dist = pmin(dist, 100)),
aes(x = x, y = y, fill = dist)) +
# optional. shows outline of France for reference
geom_polygon(data = map.FR,
aes(x = long, y = lat, group = group),
fill = NA, colour = "white") +
# define colour range, mid point, & transformation (if desired) for fill
scale_fill_gradient2(low = "yellow", mid = "red", high = "black",
midpoint = 4, trans = "sqrt") +
labs(x = "longitude",
y = "latitude",
fill = "Distance in km") +
coord_quickmap()
推荐阅读
- c++ - ListNode 的删除指针给出错误
- mysql - 提高 GCP SQL 故障转移的速度
- dialogflow-es - 填充对话框流代码无法与实时数据库连接
- mips - 在 MIPS 中,命令行参数究竟是如何存储在 $a1 中的?
- sql-server - 在golang中将datetimeoffset转换为datetime?
- java - 如何通过按下按钮来替换 div 的内容
- vb.net - 异步搜索 Outlook 全局地址列表
- node.js - Docker Express Node.js 应用程序容器未与 MongoDB 容器连接,给出错误 TransientTransactionError
- css - 使用 Flex-box 堆叠列表
- python - 从 Numpy 数组中删除单引号