You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:34:49