R中5x5网格单元与土壤样本物种分布相似性可视化异常排查
问题根源与解决方案
你的垂直条纹问题核心出在直接在WGS84地理坐标系(经纬度,球面)下创建“等距离”网格——WGS84的度数单位不是实际距离,相同经度差对应的地面距离会随纬度变化(纬度越高,经度方向的1度实际距离越短)。你用1/22.2作为网格间隔(对应约0.045度),在瑞士的纬度(45-48°N),经度方向的0.045度实际距离只有~3.4km,远小于你想要的5km,这种网格形状的扭曲会导致部分经度带的网格单元物种组成异常(比如单元面积过小,物种数不足),最终呈现低相似性的垂直条纹。
正确的做法是先将数据转换为瑞士本地的平面投影坐标系(EPSG:2056,LV95),该坐标系以米为单位,能准确创建5x5km的等距网格,再转回地理坐标系用于绘图。
修改后的完整代码
1. 重构网格创建逻辑
library(dplyr) library(sf) library(rnaturalearth) library(ggplot2) # 1. 将ref_df转换为sf对象,初始CRS设为WGS84(EPSG:4326) ref_sf <- st_as_sf(ref_df, coords = c("lon", "lat"), crs = 4326) # 2. 转换为瑞士LV95投影坐标系(单位:米) ref_lv95 <- st_transform(ref_sf, crs = 2056) # 3. 在平面坐标系下创建5x5km网格 grid_size_m <- 5000 # 5000米=5km ref_lv95 <- ref_lv95 %>% mutate( # 提取投影坐标系下的x、y坐标 x = st_coordinates(.)[,1], y = st_coordinates(.)[,2], # 计算网格中心坐标 x_grid = floor(x / grid_size_m) * grid_size_m + grid_size_m/2, y_grid = floor(y / grid_size_m) * grid_size_m + grid_size_m/2 ) # 4. 聚合得到每个网格的物种存在/缺失矩阵 grid_species <- ref_lv95 %>% group_by(x_grid, y_grid) %>% summarise( # 对每个物种标记是否存在(1=存在,0=不存在) across(where(is.numeric) & !c(x, y), ~as.integer(any(. == 1))) ) %>% ungroup() # 5. 将网格中心转回WGS84地理坐标系,用于后续相似性计算和绘图 grid_species_sf <- st_as_sf(grid_species, coords = c("x_grid", "y_grid"), crs = 2056) %>% st_transform(crs = 4326) %>% mutate( lon = st_coordinates(.)[,1], lat = st_coordinates(.)[,2] ) %>% st_drop_geometry() # 转回普通数据框用于相似性计算
2. 相似性计算与绘图(调整后)
# 假设已完成Dice-Sorensen系数计算,得到sorensen_mean数据框 grid_cells_sf <- st_as_sf(sorensen_mean, coords = c("lon", "lat"), crs = 4326) # 获取瑞士边界并绘图 ch_map <- ne_countries(scale = "medium", country = "Switzerland", returnclass = "sf") grid_ch <- st_intersection(grid_cells_sf, ch_map) ggplot() + geom_sf(data = grid_ch, aes(color = sorensen_sim), shape = 15, size = 2) + scale_color_viridis_c(option = "viridis") + theme_minimal() + theme(legend.position = "bottom", axis.title = element_blank()) + labs(color = "Similarity", x = "Longitude", y = "Latitude")
为什么大网格能避免条纹?
当你用更大的网格(如8x8km)时,网格单元的面积足够大,能抵消球面坐标系下度数间隔带来的形状扭曲,不同经度带的网格单元物种组成差异被平均,因此垂直条纹消失。但这种方案只是掩盖了问题,只有用平面投影坐标系创建等距网格,才能得到准确的结果。
内容的提问来源于stack exchange,提问作者Elie Tièche
相关产品推荐
相关产品推荐

