我有两个数据框:
ref_df 每行包含有关物种及其记录的纬度和经度的信息,并且
sample_df,样本名称为行,物种名称为列,每个单元格为 1(存在)或 0(不存在)。
我现在想将 ref_df 及其坐标放入 5x5 Km 网格中,并获得类似于我的 sample_df 的存在/不存在数据框。因此,每一行都是一个不同的坐标对,列是物种名称,单元格是 agin、1 或 0。
然后,我根据物种组成计算每个网格单元和每个样本的 Dice-Sorensen 系数。然而,当我绘制网格单元格时,我得到了这些非常奇怪的单元格垂直线,它们显示出超低的相似性。这是由于我创建 5x5km 网格的方式所致吗?
当我按照描述转换 ref_df 时,我将其转换为以下形式:
这很棒,因为计算了 ref_df 和 sample_df
之间的相似系数工作完美。问题是实际的绘图:
grid_size <- 1/22.2 # for geeting 5x5km
ref_df<- ref_df%>%
mutate(lon_grid = floor(lon / grid_size) * grid_size + grid_size/2,
lat_grid = floor(lat / grid_size) * grid_size + grid_size/2)
计算相似度然后绘图:
# Getting the border of Switzerland
ch_map <- ne_countries(scale = "medium", country = "Switzerland", returnclass = "sf")
# Converting the sorensen similarity results to sf
grid_cells_sf <- st_as_sf(sorensen_mean, coords = c("lon", "lat"), crs = 4326)
grid_ch <- st_intersection(grid_cells_sf, ch_map)`
# Plotting similarity on 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")
如果我采用更大的网格,例如8x8 公里
看来你的“网格”是由 ggplot 绘制的正方形组成的:
shape = 15, size = 2
。我建议使用 st::st_make_grid()
函数创建空间网格并将值分配给网格本身,例如:
ch <- geodata::gadm("CH", level = 0, path = "data")
ch <- ch |>
sf::st_as_sf() |>
sf::st_transform(crs = "EPSG:21781")
ch_gr <- sf::st_make_grid(ch, cellsize = c(5000, 5000)) |>
sf::st_sf() |>
sf::st_filter(ch)
现在让我们模拟一下瑞士的一些物种出现情况:
occurence <- sf::st_sample(ch, size = 10000) |>
sf::st_sf()
并将计数分配给
ch_gr
网格。
ch_gr$count <- lengths(sf::st_intersects(ch_gr, occurence))
在你的情况下,我会将
ch_gr
与 ref_df
相交,以便每个网格中存在/不存在物种。
tmap::qtm(ch_gr, fill = "count")
library(ggplot2)
ggplot() +
geom_sf(data = ch_gr , aes(color = count)) +
scale_color_viridis_c(option = "viridis") +
theme_minimal() +
theme(legend.position = "bottom",axis.title = element_blank())+
labs(color = "Count", x = "Longitude", y = "Latitude")
创建于 2024 年 12 月 10 日,使用 reprex v2.1.1