如何用R语言基于美国邮编数据创建热力图及响应数地图?
R语言实现美国邮编地理可视化方案
任务1:按邮编统计响应数量的地图(基于choroplethrZip)
choroplethrZip是专门用于美国邮编级地图可视化的工具,步骤如下:
1. 安装并加载依赖包
install.packages(c("choroplethrZip", "dplyr")) library(choroplethrZip) library(dplyr)
2. 预处理数据
确保数据集(假设名为df)中Zip_code为字符型(避免丢失前导零),统计每个邮编的响应数量并调整列名匹配工具要求:
# 统计各邮编响应数 zip_stats <- df %>% group_by(Zip_code) %>% summarize(response_count = n()) %>% rename(region = Zip_code, value = response_count) # 必须用region和value作为列名
3. 绘制邮编地图
# 生成全国范围的邮编统计地图 zip_choropleth( zip_stats, title = "美国各邮编响应数量分布", legend = "响应数量", num_colors = 7, # 自定义颜色分档数 zip_zoom = NULL # NULL表示显示全部美国邮编区域 )
若需聚焦特定区域,可将zip_zoom设为目标邮编向量(如c("90210", "10001"))。
任务2:Magnitude插值热力图
要生成平滑热力效果的插值图,可通过克里金插值结合ggplot2或leaflet实现,步骤如下:
1. 安装并加载依赖包
install.packages(c("zipcode", "gstat", "ggplot2", "maps", "sf")) library(zipcode) library(gstat) library(ggplot2) library(maps) library(sf)
2. 匹配邮编与经纬度
将邮编转换为地理坐标:
# 加载内置邮编经纬度数据 data(zipcode) # 合并用户数据与地理信息,过滤无效坐标 df_geo <- df %>% mutate(Zip_code = as.character(Zip_code)) %>% left_join(zipcode, by = c("Zip_code" = "zip")) %>% filter(!is.na(latitude), !is.na(longitude))
3. 执行克里金插值
创建覆盖美国本土的网格,对Magnitude进行空间插值:
# 获取美国州界底图数据 usa_states <- map_data("state") # 生成插值网格(分辨率可通过length.out调整) interp_grid <- expand.grid( lon = seq(min(usa_states$long), max(usa_states$long), length.out = 200), lat = seq(min(usa_states$lat), max(usa_states$lat), length.out = 200) ) # 普通克里金插值 krige_result <- krige( Magnitude ~ 1, locations = ~lon + lat, data = df_geo %>% rename(lon = longitude, lat = latitude), newdata = interp_grid )
4. 绘制静态热力图
ggplot() + # 绘制州界底图 geom_polygon( data = usa_states, aes(x = long, y = lat, group = group), fill = "white", color = "gray60", linewidth = 0.3 ) + # 绘制插值热力层 geom_tile( data = krige_result, aes(x = lon, y = lat, fill = var1.pred), alpha = 0.7 ) + # 设置颜色渐变 scale_fill_viridis_c(option = "plasma", name = "Magnitude插值值") + # 适配美国地图比例 coord_fixed(ratio = 1.3) + labs(title = "美国Magnitude空间插值热力图", x = "经度", y = "纬度") + theme_minimal()
可选:交互式热力图(基于leaflet)
若需可交互的地图,用leaflet实现:
library(leaflet) # 将插值结果转为空间对象 grid_sf <- st_as_sf(interp_grid, coords = c("lon", "lat"), crs = 4326) krige_sf <- st_sf(krige_result, geometry = grid_sf$geometry) # 生成交互式地图 leaflet() %>% addProviderTiles("CartoDB.Positron") %>% addPolygons( data = st_as_sf(usa_states, coords = c("long", "lat"), group = group), fillOpacity = 0, color = "gray", weight = 1 ) %>% addRasterImage( krige_sf$var1.pred, colors = viridis::plasma(100), opacity = 0.7 ) %>% addLegend( pal = colorNumeric("plasma", domain = krige_sf$var1.pred), values = krige_sf$var1.pred, title = "Magnitude" )
内容的提问来源于stack exchange,提问作者Benji
相关产品推荐
相关产品推荐

