python - 使用 subgraph() 并通过 igraph python 保留顶点属性

标签 python igraph subgraph vertex-attributes

我想将断开连接的图分区为 block (以使用community_spinglass)。然而,一旦我获得子图并使用community_spinglass(),原始图中顶点的标签就会丢失。我正在处理 40 多个顶点,因此追踪它们并不容易。这是我的问题的“玩具示例”:

import igraph
from igraph import Graph
g4_matrix = [ [0,0,-1,0,0,0,0], [0,0,0,0.8,0.2,0,0], [-1,0,0,0,0,0,0], [0,0.8,0,0,1,0,0.1], [0,0.2,0,1,0,-0.3,-.7], [0,0,0,0,-0.3,0,1], [0,0,0,0.1,-0.7,1,0] ]
v_name = ["1", "2", "3", "4", "5", "6", "7"]
g4 = Graph.Weighted_Adjacency(g4_matrix, mode = 'undirected',attr = 'weight' )
igraph.plot(g4,bbox = (300, 300),vertex_label = v_name)

Original graph with labels

获得区 block 和社区后:

g4_blocks = g4.blocks()
g4_block = g4.vs.select(g4_blocks[1])
Block1 = g4.subgraph(g4_block)
igraph.plot(Block1, bbox = (200, 200), vertex_label = v_name)

Subgraph, as observed the vertices follow v_name list in order and don't preserve past label

但是我们看到顶点按顺序遵循 v_name 列表,而不是它们之前的标签。此外,当我们获取社区时:

comm = Block1.community_spinglass()
for c in comm:
    print c

[2, 3, 4]
[0, 1]

我们得到了子图的索引,但很难与原始图的索引联系起来。

有没有办法获取引用原始图的索引或标签的社区?

提前致谢。

最佳答案

使用Block1.vs[c]["name"]获取Block1内社区c中的节点名称。说明:

  1. Block1.vs 是整个 Block1 图的顶点序列。

  2. Block1.vs[c] 将此顶点序列子集为仅索引位于名为 c 的可迭代对象中的节点,这就是您的 for 中的情况循环。

  3. Block1.vs[c]["name"] 检索您在上一步中选择的顶点的 name 顶点属性。由于名称保存在子图中,这应该允许您将 Block1 的节点关联回原始图。

关于python - 使用 subgraph() 并通过 igraph python 保留顶点属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35445005/

相关文章:

graphviz - 如何将 graphviz 子图集群的标签定位在左侧?

python - Py_initialize/Py_Finalize 不能与 numpy 一起工作两次

python - 如何在Python中生成所有可能的5个字母数字的列表?

algorithm - 加权有向图中的密度

r - for循环删除igraph中的顶点属性

r - igraph delete_edges 行为异常

algorithm - 如何从图中获取所有子图?

python - 手动触发一个 wx.EVT_SIZE 事件

Python facebook-sdk 发布到页面