【问题标题】:How to plot an igraph object on a vector map in R如何在 R 中的矢量图上绘制 igraph 对象
【发布时间】:2023-03-27 01:41:01
【问题描述】:

我使用igraphsf 包。

我有一个 igraph 对象,其顶点具有空间坐标geo_dist_graph。 顶点名称和坐标如下所示:

grid_grid <- 
structure(list(coords.x1 = c(15.504078, 15.704078, 15.904078, 
15.104078, 15.304078, 15.504078, 15.704078, 15.104078, 15.304078, 
15.704078, 14.904078, 14.304078, 13.904078, 14.704078, 13.704078, 
14.104078, 14.704078, 14.904078, 13.704078, 13.904078, 14.704078, 
13.704078, 13.904078, 14.304078), 
coords.x2 = c(43.835623, 43.835623, 
43.835623, 44.035623, 44.035623, 44.035623, 44.035623, 44.235623, 
44.235623, 44.235623, 44.435623, 44.635623, 44.835623, 44.835623, 
45.035623, 45.035623, 45.035623, 45.035623, 45.235623, 45.235623, 
45.235623, 45.435623, 45.435623, 45.435623), 
g9.nodes = c(27, 
28, 29, 40, 41, 42, 43, 55, 56, 58, 69, 81, 94, 98, 108, 110, 
113, 114, 123, 124, 128, 138, 139, 141)), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"
))

该图来自一个简单的平方邻接矩阵:

geo_dist_graph <- 
  structure(c(NA, 1, 1, NA, NA, 1, 1, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, 1, NA, NA, NA, 
1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1, 1, NA, NA, NA, NA, 1, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, 
NA, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 1, NA, 1, NA, NA, 1, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, 1, NA, 
1, NA, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1, 1, 1, NA, NA, 1, NA, NA, NA, 1, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, 
NA, 1, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 1, 1, 1, NA, 1, NA, 1, 1, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 1, NA, 
1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 1, 1, NA, NA, NA, NA, 1, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 1, 1, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, 1, 1, 
NA, NA, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1, 1, NA, NA, NA, NA, 1, 1, NA, NA, 1, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, 1, NA, 
NA, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1, 1, NA, 1, NA, NA, NA, NA, 1, NA, NA, NA, 1, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, 1, 
NA, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 1, NA, NA, 1, NA, NA, NA, 1, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, 
NA, 1, NA, 1, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1, NA, 1, 1, NA, NA, 1, NA, NA, 1, 1, 1, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, 1, 1, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 1, 1, NA, NA, 1, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, 
1, NA, 1, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 1, NA, NA, NA, 1, NA, NA, 1, NA), 
.Dim = c(24L, 
24L))

colnames(geo_dist_graph) <- grid_grid$g9.nodes
row.names(geo_dist_graph) <- grid_grid$g9.nodes

geo_dist_graph <- graph_from_adjacency_matrix(geo_dist_graph, mode = "upper", diag = F)

这样连接的空间坐标:

V(geo_dist_graph)$x <- 
  grid_grid$coords.x1[match(V(geo_dist_graph)$name, grid_grid$g9.nodes)]

V(geo_dist_graph)$y <- 
  grid_grid$coords.x2[match(V(geo_dist_graph)$name, grid_grid$g9.nodes)]

使用plot 函数时,该图在空间中正确绘制。但是当我尝试添加像plot(map_crop_sp, add = T) 这样的底图时,地图不会显示在图表后面,但没有错误消息。

地图是矢量图,不知道重要不。这是用于创建它的代码。

map <- st_read("ne_10m_coastline/ne_10m_coastline.shp")
map_crop <- st_crop(map, xmin = 13.304078, ymin = 43.635623, xmax = 16.503846, ymax = 45.60185)
map_crop_sp <- as(map_crop, Class = "Spatial")

【问题讨论】:

  • 嗨,欢迎来到 StackOverflow。您能否提供minimal, reproducible set,即一些小数据集和随附代码,以便其他人可以重现此问题?如果您无法共享您的数据,请尝试生成一些看起来像您的真实数据的任意数据。因为现在,由于多种原因,可能会出现问题。
  • 嗨,谢谢你们,我添加了一些数据和代码。我希望这会有所帮助。
  • 您好,我重新格式化了数据(使用dput),以便为其他人复制。另外,当我运行st_read("ne_10m_coastline/ne_10m_coastline.shp") 时,它说该文件不存在,所以我想你是从某个地方下载的?
  • 谢谢!是的,来自naturalearthdata.com/downloads/10m-physical-vectors。我也可以附上文件,但我不知道怎么做。
  • 好的,完美。对不起,最后一个问题。似乎geo_dist_graph 是一个igraph 对象,但我无法将矩阵转换为igraph。特别是,我不确定您的代码中的 g9.nodes 是什么。您可以在您的数据上运行dput(geo_dist_graph) 并在开头的帖子中替换它吗?

标签: r plot graph igraph


【解决方案1】:

回答

由于igraph 应该在地图的顶部,所以我将其绘制在第二个位置。我还加了rescale = F

plot(map_crop_sp)
plot(geo_dist_graph, add = T, rescale = F)

基本原理

我输入了?plot.igraph。从那里,我找到了?igraph.plotting。似乎绘制 igraph 对象会重新缩放它(plot(..., rescale = TRUE):

逻辑常数,是否将坐标重新缩放到[-1,1]x-1,1区间。 tkplot 没有实现该参数。

默认为 TRUE,布局将被重新缩放。

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2018-09-07
    • 2016-11-04
    相关资源
    最近更新 更多