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

3

我完全不了解图形学。我有一个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标签中的索引顺序。


不清楚你的问题是什么。你的方法不起作用,还是你想知道是否有更好的方法?在这段代码中,变量coloredges有什么用处?你能给我们举一个2x2或3x3距离矩阵的小例子,以便我们能够理解你试图实现什么? - Reti43
在3X3中,每一列将代表一个时间事件。所以我有1->2->3的事件。我想通过用相同颜色着色相邻节点连接的边来显示这个时间演化。我还有节点之间的距离,我通过$dist$属性传递。我编写代码的方式是,我无法指定标签和节点号。因此,节点号“1”被分配一个标签,该标签可能是time_pres的某个索引而不是1。因此,我无法记录哪个节点分配给哪个标签。 - pg2455
time_pres变量保存了什么值?只需给我一个3x3的例子中的9。 - Reti43
time_pres = [('person1', '1878'), ('person2','1879'), ...],而dist是一个213 X 213的numpy矩阵。 - pg2455
请告诉我是否我理解正确。如果你有两个标签为('person1', '1878')和('person2', '1879'),索引分别为0和1的节点,那么 time_pres = [('person1', '1878'), ('person2', '1879')]。而且dist[0,1]是 ('person1', '1878') 和 ('person2', '1879')之间的距离。这样理解正确吗? - Reti43
显示剩余2条评论
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 顺序不同。您可以通过它们的标签引用节点。它们没有任何其他id号或其他东西。
现在,添加边。如果两个节点尚不存在于图形中,则手册指出将添加其中任何一个节点。因此,当您执行以下操作时:
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]之间的距离将由G.add_edge()中的dist=dist[i,j]属性决定。实际上,节点的位置是由一个包含节点x和y位置的元组决定的。请参阅nx.draw()手册
如果你不定义节点位置,它们将随机生成。在你的情况下,你需要像这样的字典:
pos = {('person1', '1878'): (23, 10),
       ('person2', '1879'): (18, 11),
       etc}

那么,节点i和节点j之间的坐标将等于dist[i,j]。你需要弄清这些坐标,但由于你未明确说明如何得出矩阵dist,我无法发表意见。


嗨,非常感谢您的解释。现在我似乎明白了。不过,我想知道是否有一种算法可以根据距离矩阵自动给出节点坐标。距离的解释如下:如果我有一个3X2矩阵,每列代表2D向量的一个节点,我可以创建一个3X3维度的距离矩阵(它将是对称的)。 - pg2455
很遗憾,这不够清晰。它也值得有自己的问题,无论是在Stack Overflow还是Math Overflow上。随着200多个节点,这可能会变得非常复杂。 - Reti43
很抱歉,我之前评论中说错了,3X2矩阵应该是2X3。有人告诉我可以使用Gephi进行图形可视化,所以我现在正在学习Gephi。希望我能够通过它得到解决方案。 - pg2455

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接