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

时间:2014-07-15 21:33:53

标签: python graph data-visualization 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为数字的节点,而不是time_pres中的标签索引。

感谢你的帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

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

因此,我们假设变量time_pres定义如下

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

然后,

G.add_nodes_from(time_pres)

使用标签('person1', '1878')('person2', '1879')等创建节点。这些节点保存在字典中,其中键是节点的标签,并且值是与每个节点相关的任何其他属性。在您的情况下,您没有属性。您也可以在manual online中看到此消息,或者键入help(G.add_nodes_from)

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

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

这将打印标签列表,但由于它们来自字典,因此它们可能与time_pres的顺序不同。您可以通过标签引用节点。他们没有任何额外的身份证号码或其他任何内容。

现在,添加边缘。 manual表示如果两个节点中的任何节点都不在图中,则会添加它们。所以,当你做的时候

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()的{​​{3}}。

  

pos :字典,可选

     

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

如果您没有定义节点位置,它们将随机生成。在您的情况下,您需要一个像

这样的字典
pos = {('person1', '1878'): (23, 10),
       ('person2', '1879'): (18, 11),
       etc}

然后,节点ij之间的坐标将产生等于dist[i,j]的距离。你必须弄清楚这些坐标,但由于你没有清楚地说明你如何推导出矩阵dist,我不能说出任何关于它的信息。