NetworkX 图:用有序列表创建节点

3 投票
1 回答
5559 浏览
提问于 2025-04-18 13:28

我对图形完全是个新手。我有一个213 X 213的距离矩阵。我一直在尝试用网络来可视化这个距离矩阵,我的想法是,距离较远的节点在绘制图形时会显示为不同的簇。所以我正在创建一个图,节点代表列索引。我需要跟踪这些节点,以便之后给它们贴标签。我需要按照特定的顺序添加边,因此我需要记录节点及其标签。

这是我的代码:

import networkx as nx
G = nx.Graph()
G.add_nodes_from(time_pres) ##time_pres is the list of labels that I want specific node to have

 for i in range(212):
    for j in range(i+1, 212):
        color = ['green' if j == i+1 else 'red'][0]
        edges.append((i,j, dist[i,j], 'green')) ##This thing requires allocation of distance as per the order in dist matrirx
        G.add_edge(i,j, dist = dist[i,j], color = 'green')

我现在的做法是,给节点分配一个数字作为ID,这个ID并不是按照time_pres中的标签索引来的。

1 个回答

4

我可以回答你似乎在问的问题,但这并不是你麻烦的结束。具体来说,我会告诉你哪里出错了。

首先,我们假设变量 time_pres 是这样定义的:

time_pres = [('person1', '1878'), ('person2', '1879'), etc)]

然后,

G.add_nodes_from(time_pres)

这段代码创建了带有标签 ('person1', '1878')('person2', '1879') 等的节点。这些节点被保存在一个字典里,字典的键是节点的标签,值是与每个节点相关的其他属性。在你的情况下,你没有任何属性。你可以通过查看在线手册,或者输入 help(G.add_nodes_from) 来确认这一点。

你甚至可以通过输入以下任意一行来查看节点的标签。

G.nodes()        # either this
G.node.keys()    # or this

这会打印出标签的列表,但由于它们来自字典,所以可能和 time_pres 的顺序不一样。你可以通过标签来引用这些节点。它们没有额外的编号或其他东西。

现在,关于添加边的部分。手册上说,如果两个节点不在图中,它们中的任何一个都会被添加。所以,当你执行

G.add_edge(i, j, dist = dist[i,j], color = 'green')

时,ij 是数字,它们会被添加到图中,因为它们在图的标签中并不存在。因此,你最终会添加节点 ij 以及它们之间的边。而你想做的是

G.add_edge(time_pres[i], time_pres[j], dist = dist[i,j], color = 'green')

这将会在节点 time_pres[i]time_pres[j] 之间添加一条边。根据我的理解,这正是你的目标。


然而,你似乎期望在绘制图形时,节点 time_pres[i]time_pres[j] 之间的距离是由 dist=dist[i,j]G.add_edge() 中决定的。实际上,节点的位置是由一个包含节点 x 和 y 坐标的元组决定的。关于 nx.draw()手册中有说明。

pos : 字典,可选

一个以节点为键、位置为值的字典。如果没有指定,将计算一个弹簧布局的位置。有关计算节点位置的函数,请参见 networkx.layout。

如果你不定义节点的位置,它们将会随机生成。在你的情况下,你需要一个像这样的字典:

pos = {('person1', '1878'): (23, 10),
       ('person2', '1879'): (18, 11),
       etc}

这样,节点 ij 之间的坐标就会产生一个等于 dist[i,j] 的距离。你需要弄清楚这些坐标,但由于你没有明确说明你是如何得出矩阵 dist 的,我无法对此做出评论。

撰写回答