使用ggplot将带化学数据的点位映射至shapefile遇阻求助
解决ggplot绘制空间点位到shapefile底图的问题
别发愁,完全不用非得用tmap!用ggplot2配合sf包就能轻松实现你的需求——你之前踩了个小坑:把转换好的sf空间对象又转回了普通数据框,这就丢了空间坐标的上下文信息,ggplot自然没法把点位和shapefile匹配上啦。
下面是具体的步骤,跟着做就能搞定:
1. 读取并处理shapefile
首先用sf包的st_read()读取你的shapefile,sf会自动识别文件的空间属性:
library(sf) # 替换成你的shapefile实际文件路径 study_area <- st_read("你的shapefile路径.shp")
2. 正确处理点位数据(保留sf对象!)
你之前用st_as_sf()转换点位是对的,但千万别再用as.data.frame()转回去,要保留sf对象的空间属性:
library(dplyr) Master_cave_data <- Master_cave_data %>% st_as_sf(coords = c('Long_DD', 'Lat_DD'), crs = 4326) # 这里不需要设置sf_column_name = NULL,默认保留空间列即可
3. 统一空间参考(CRS)
确保点位数据和shapefile的CRS一致,不然两者的坐标不在同一个坐标系里,没法叠加。可以用st_transform()统一转换:
# 把shapefile的CRS转换成和点位一致的4326(WGS84经纬度坐标系) study_area <- study_area %>% st_transform(crs = 4326)
4. 用ggplot绘制叠加图
现在就可以用ggplot把底图和点位画在一起了,还能根据你的化学数据做可视化映射(比如用颜色区分不同数值):
library(ggplot2) ggplot() + # 先绘制shapefile底图,设置填充色和边框色 geom_sf(data = study_area, fill = "#f0f0f0", color = "#333333") + # 再绘制点位,这里假设你的化学数据列名叫Chem_Value,用颜色映射数值 geom_sf(data = Master_cave_data, aes(color = Chem_Value), size = 3, alpha = 0.8) + # 添加标题、坐标轴标签和图例名称 labs( title = "野外站点化学数据空间分布", x = "经度", y = "纬度", color = "化学数据值" ) + # 选用简洁的主题 theme_minimal() + # 让标题居中显示(可选) theme(plot.title = element_text(hjust = 0.5))
关键小提醒
- 始终保留sf对象格式:sf对象自带空间坐标和CRS信息,ggplot的
geom_sf()能直接识别并处理,转成普通数据框就会丢失这些关键信息。 - 如果你的化学数据是分类变量(比如不同站点类型),只需把
aes(color = 分类列名),ggplot会自动切换为离散颜色标尺。
内容的提问来源于stack exchange,提问作者JackWassik
相关产品推荐
相关产品推荐

