我对图表完全陌生。我有一个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中的标签索引。
感谢你的帮助。谢谢!
答案 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')
其中,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()
的{{3}}。
pos :字典,可选
以节点为键,位置为值的字典。如果未指定,则将计算弹簧布局定位。有关计算节点位置的函数,请参阅networkx.layout。
如果您没有定义节点位置,它们将随机生成。在您的情况下,您需要一个像
这样的字典pos = {('person1', '1878'): (23, 10),
('person2', '1879'): (18, 11),
etc}
然后,节点i
和j
之间的坐标将产生等于dist[i,j]
的距离。你必须弄清楚这些坐标,但由于你没有清楚地说明你如何推导出矩阵dist
,我不能说出任何关于它的信息。