ggplot2中基于最大距离的空间网络

Spatial network based on maximum distance in ggplot2

我想在 ggplot 中绘制区域网络矩阵 - 我知道对于 ggplot 我们需要 data.frame 整洁的格式才能绘制它。

我可以在 ggplot 中根据邻居数量绘制网络,但是当我需要基于最大距离的空间网络时,我在为 ggplot 创建数据框时遇到错误。

我在下面提供了示例:

library(ggplot2)
library(sf)
library(spdep)

# Polygon data
URL <- "https://biogeo.ucdavis.edu/data/gadm3.6/Rsp/gadm36_DEU_1_sp.rds"
data <- readRDS(url(URL))

CORD <- rbind(
  coordinates(data)
)
rownames(CORD) <- NULL

# Spatial Network based on number of neighbours
cns <- knearneigh(CORD, k = 5, longlat=T)
scnsn <- knn2nb(cns, row.names = NULL, sym = T)
cS <- nb2listw(scnsn)

data_df <- data.frame(CORD)
colnames(data_df) <- c("long", "lat")

# Creating dataframe  from spatail network (neiresth neighbours) for ggplot plot
n = length(attributes(cS$neighbours)$region.id)
DA = data.frame(
  from = rep(1:n,sapply(cS$neighbours,length)),
  to = unlist(cS$neighbours),
  weight = unlist(cS$weights)
)
DA = cbind(DA, data_df[DA$from,], data_df[DA$to,])
colnames(DA)[4:7] = c("long","lat","long_to","lat_to")

# ggplot of spatial network
ggplot(data, aes(x = long, y =lat))+
  geom_polygon(aes(group = group), color = "red", fill = FALSE) +
  geom_segment(data = DA, aes(xend = long_to, yend = lat_to), size=0.5, color = "royalblue") + 
  coord_map()


### Another type of network matrix - Maximum distance

nb200km <- dnearneigh(CORD, d1=0, d2=100, longlat=T)
summary(nb200km)
cS_distance <- nb2listw(nb200km, zero.policy = T)

# I need to recreate this plot in ggplot
plot(data)
plot(W, coordinates(data), add = T)



data_df <- data.frame(CORD)
colnames(data_df) <- c("long", "lat")

n = length(attributes(cS_distance$neighbours)$region.id)
DA = data.frame(
  from = rep(1:n,sapply(cS_distance$neighboaurs,length)),
  to = unlist(cS_distance$neighbours),
  weight = unlist(cS_distance$weights)
)
DA = cbind(DA, data_df[DA$from,], data_df[DA$to,])
colnames(DA)[4:7] = c("long","lat","long_to","lat_to")

cS 对象创建数据框有效,但是从 cS_distance 对象创建数据框 returns 出错。

请问如何解决ggplot中的error和plot distance spatial network

我不确定这是否是您要查找的内容,但问题似乎是您在 cS_distance 中有一些没有邻居的区域,因此 DA$to 包含一些零值。这意味着当您执行 data_df[DA$from,] 时,它的行数多于 data_df[DA$to,],并且当您尝试 cbind 它们时,您的代码会抛出错误。

如果过滤掉 DA$to 为零的行,您会得到:

n = length(attributes(cS_distance$neighbours)$region.id)
from <- rep(1:n,sapply(cS_distance$neighbours,length))
to <- unlist(cS_distance$neighbours)[]
weight <- numeric(length(to))
weight[which(to != 0)] <- unlist(cS_distance$weights)
DA = data.frame(from = from, to = to, weight = weight)
DA <- DA[DA$to != 0,]
DA = cbind(DA, data_df[DA$from,], data_df[DA$to,])

colnames(DA)[4:7] = c("long","lat","long_to","lat_to")

# ggplot of spatial network
ggplot(data, aes(x = long, y =lat))+
  geom_polygon(aes(group = group), color = "red", fill = NA) +
  geom_segment(data = DA, aes(xend = long_to, yend = lat_to), size=0.5, color = "royalblue") + 
  coord_map()