NetworkX 图:用有序列表创建节点
我对图形完全是个新手。我有一个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 个回答
我可以回答你似乎在问的问题,但这并不是你麻烦的结束。具体来说,我会告诉你哪里出错了。
首先,我们假设变量 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')
时,i
和 j
是数字,它们会被添加到图中,因为它们在图的标签中并不存在。因此,你最终会添加节点 i
和 j
以及它们之间的边。而你想做的是
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}
这样,节点 i
和 j
之间的坐标就会产生一个等于 dist[i,j]
的距离。你需要弄清楚这些坐标,但由于你没有明确说明你是如何得出矩阵 dist
的,我无法对此做出评论。