如何用ggplot2绘制含经纬度的地图?处理9000+观测值缺失值报错
解决方案
1. 数据清理:移除经纬度缺失值
报错的核心原因是坐标列存在缺失值,st_as_sf不允许这种情况。先导入并清理三个数据集,同时添加标识列区分来源:
# 加载依赖包 library(tidyverse) library(sf) library(readxl) # 导入并清理单个数据集(示例文件名,替换为你的实际文件名) clean_data <- function(file_path, dataset_name) { read_excel(file_path) %>% drop_na(lon, lat) %>% # 移除经纬度任意一列缺失的行 mutate(dataset = dataset_name) # 添加数据集标识 } data1 <- clean_data("data1.xlsx", "数据集1") data2 <- clean_data("data2.xlsx", "数据集2") data3 <- clean_data("data3.xlsx", "数据集3") # 合并所有清理后的数据集 combined_data <- bind_rows(data1, data2, data3)
2. 转换为空间对象(解决ggplot2报错)
清理完成后,将数据转换为sf格式,就可以正常用于空间可视化:
# 转换为sf空间对象,设置坐标系(亚利桑那州常用WGS84,EPSG:4326) sf_data <- st_as_sf(combined_data, coords = c("lon", "lat"), crs = 4326)
3. 分别展示各数据集观测点
用分面图单独展示每个数据集的分布:
ggplot(sf_data) + geom_sf(aes(color = dataset)) + facet_wrap(~dataset, ncol = 2) + theme_minimal() + labs(title = "各数据集观测点分布", color = "数据集")
4. 分层叠加展示所有观测点
在同一张图中叠加所有数据,用颜色区分不同数据集,可搭配亚利桑那州底图:
# 获取亚利桑那州底图数据 az_base <- map_data("state") %>% filter(region == "arizona") ggplot() + # 绘制州界底图 geom_polygon(data = az_base, aes(x = long, y = lat, group = group), fill = "#f0f0f0", color = "#cccccc") + # 叠加观测点 geom_sf(data = sf_data, aes(color = dataset), alpha = 0.6, size = 0.8) + coord_sf(crs = 4326) + theme_minimal() + labs(title = "亚利桑那州所有观测点叠加分布", color = "数据集")
5. mapview处理大数据集优化
mapview支持大数据集,只需调整渲染参数降低压力:
library(mapview) # 优化显示:降低透明度和点大小,减少渲染负载 mapview(sf_data, zcol = "dataset", alpha = 0.5, cex = 0.7)
内容的提问来源于stack exchange,提问作者Irving C.
相关产品推荐
相关产品推荐

