使用ggplot的空间网络图
spatial network plot using ggplot
我想在 ggplot2
中重现区域的空间依赖关系图,而不是在 R
中使用基本的 plot
我在下面的代码中提供了可重现的示例:
我遵循了示例:
library(leaflet)
library(ggplot2)
library(sf)
library(spdep)
URL <- "https://biogeo.ucdavis.edu/data/gadm3.6/Rsp/gadm36_CZE_1_sp.rds"
data <- readRDS(url(URL))
ggplot() +
geom_polygon(data = data, aes(x=long, y = lat, group = group), color = "black", fill = F)
cns <- knearneigh(coordinates(data), k = 3, longlat=T)
scnsn <- knn2nb(cns, row.names = NULL, sym = T)
cns
scnsn
cS <- nb2listw(scnsn)
summary(cS)
# Plot of regions and k-nn neighthorhours matrix
plot(data)
plot(cS, coordinates(data), add = T)
我问的是如何使用 ggplot
重现 Plot of regions and k-nn neighthorhours matrix
。
我知道我们必须检索每个点输入然后使用 geom_segment
,但是我不知道如何从 cS 对象中检索它。
您引用的另一个 SO post 包含您需要遵循的所有步骤来获得您的情节(感谢@StupidWolf 的出色回答)。
基本上,您需要使用以下方法提取不同的段:
1) 转换dataframe中数据的坐标,方便后面使用:
data_df <- data.frame(coordinates(data))
colnames(data_df) <- c("long", "lat")
此 data_df 现在包含绘图点的所有 x、y 值。
2) 现在,我们可以使用以下方法从 cS
对象中检索段信息:
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")
在 DA
数据框中,您拥有绘制每个线段所需的所有信息
3) 最后,你可以把每一部分画出来:
ggplot(data, aes(x = long, y =lat))+
geom_polygon(aes(group = group), color = "black", fill = FALSE)+
geom_point(data = data_df, aes(x= long, y = lat), size = 1)+
geom_segment(data = DA, aes(xend = long_to, yend = lat_to), size=0.5)
同样,@StupidWolf 提供的解决方案写得非常好并且易于理解,所以我不知道您为什么无法重现它。
我想在 ggplot2
中重现区域的空间依赖关系图,而不是在 R
plot
我在下面的代码中提供了可重现的示例:
我遵循了示例:
library(leaflet)
library(ggplot2)
library(sf)
library(spdep)
URL <- "https://biogeo.ucdavis.edu/data/gadm3.6/Rsp/gadm36_CZE_1_sp.rds"
data <- readRDS(url(URL))
ggplot() +
geom_polygon(data = data, aes(x=long, y = lat, group = group), color = "black", fill = F)
cns <- knearneigh(coordinates(data), k = 3, longlat=T)
scnsn <- knn2nb(cns, row.names = NULL, sym = T)
cns
scnsn
cS <- nb2listw(scnsn)
summary(cS)
# Plot of regions and k-nn neighthorhours matrix
plot(data)
plot(cS, coordinates(data), add = T)
我问的是如何使用 ggplot
重现 Plot of regions and k-nn neighthorhours matrix
。
我知道我们必须检索每个点输入然后使用 geom_segment
,但是我不知道如何从 cS 对象中检索它。
您引用的另一个 SO post 包含您需要遵循的所有步骤来获得您的情节(感谢@StupidWolf 的出色回答)。
基本上,您需要使用以下方法提取不同的段:
1) 转换dataframe中数据的坐标,方便后面使用:
data_df <- data.frame(coordinates(data))
colnames(data_df) <- c("long", "lat")
此 data_df 现在包含绘图点的所有 x、y 值。
2) 现在,我们可以使用以下方法从 cS
对象中检索段信息:
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")
在 DA
数据框中,您拥有绘制每个线段所需的所有信息
3) 最后,你可以把每一部分画出来:
ggplot(data, aes(x = long, y =lat))+
geom_polygon(aes(group = group), color = "black", fill = FALSE)+
geom_point(data = data_df, aes(x= long, y = lat), size = 1)+
geom_segment(data = DA, aes(xend = long_to, yend = lat_to), size=0.5)
同样,@StupidWolf 提供的解决方案写得非常好并且易于理解,所以我不知道您为什么无法重现它。