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

使用ggplot2绘制瑞士地图时点位显示异常的技术求助

解决瑞士地图点位展示错误的问题

我帮你梳理下问题的核心原因和解决办法,一步步来修正:

1. 最关键的错误:坐标映射颠倒了

你在geom_point里写了aes(x=lat, y=lon),但实际上经度(lon)对应x轴,纬度(lat)对应y轴,这直接导致所有点位的位置完全错乱!把这一行修正过来,就能解决大部分问题:

geom_point(data=de, aes(x=lon, y=lat), color="orange")

2. 处理缺失的经纬度值

你的de数据里存在NA的lon/lat值,这些点不仅无法正确显示,还可能干扰绘图逻辑,建议提前过滤掉:

# 移除包含缺失经纬度的行
de_clean <- de[!is.na(de$lon) & !is.na(de$lat), ]

之后用清理后的de_clean来绘制点位即可。

3. 确保地图与点位的坐标系一致

从你的de数据来看,它用的是WGS84经纬度(EPSG:4326,符合瑞士的经纬度范围),但swissmap包的shp_df[[6]]可能采用的是瑞士本地坐标系(比如LV95/LV03)。如果修正坐标映射后点位还是不对,需要把地图数据转换为WGS84:

# 假设da是sp对象,转换坐标系到WGS84
da_wgs84 <- spTransform(da, CRS("+init=epsg:4326"))
# 转成ggplot可用的data.frame格式
da_df <- fortify(da_wgs84)

更推荐用sf包处理空间数据,操作会更简洁:

library(sf)
# 读取瑞士地图并转换为WGS84坐标系
da_sf <- st_read(system.file("shapefiles/your_shapefile.shp", package="swissmap")) %>% 
  st_transform(4326)
# 绘图时用geom_sf更省心
ggplot() +
  geom_sf(data=da_sf, fill="lightgray", color="white") +
  geom_sf(data=st_as_sf(de_clean, coords=c("lon", "lat"), crs=4326), color="orange")

4. 优化地图可视化效果

可以给地图添加填充色和边界线,让地图更清晰,同时调整坐标比例、简化主题:

ggplot() +
  # 绘制瑞士地图,设置填充和边界样式
  geom_polygon(data=da_df, aes(x=long, y=lat), fill="lightgray", color="white", linewidth=0.2) +
  # 绘制点位,用清理后的数据,调整大小和透明度
  geom_point(data=de_clean, aes(x=lon, y=lat), color="orange", size=2, alpha=0.7) +
  # 保持正确的坐标比例
  coord_fixed(ratio=1.3) +
  # 移除不必要的坐标轴元素
  theme_minimal() +
  theme(axis.text=element_blank(), axis.title=element_blank())

完整修正后的示例代码

# 加载所需包
library(rgdal)
library(maptools)
library(ggplot2)
library(plyr)
library(maps)
library(ggmap)

# 获取并转换瑞士地图数据到WGS84
da <- shp_df[[6]]
da_wgs84 <- spTransform(da, CRS("+init=epsg:4326"))
da_df <- fortify(da_wgs84)

# 清理点位数据
de_clean <- de[!is.na(de$lon) & !is.na(de$lat), ]

# 绘制最终地图
ggplot() +
  geom_polygon(data=da_df, aes(x=long, y=lat), fill="lightgray", color="white") +
  geom_point(data=de_clean, aes(x=lon, y=lat), color="orange", size=2) +
  coord_fixed(1.3) +
  theme_minimal() +
  theme(axis.text = element_blank(),
        axis.title = element_blank())

如果修正后仍有问题,可以检查da的坐标系信息,确认和de的经纬度系统是否匹配。

内容的提问来源于stack exchange,提问作者r tremeaud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:00