【问题标题】:NetworkX graph: creating nodes with ordered listNetworkX 图:使用有序列表创建节点
【发布时间】:2014-09-06 06:16:47
【问题描述】:

我对图表完全陌生。我有一个 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 距离矩阵的小例子,让我们直观地了解您想要实现的目标?
  • 在 3X3 中,每一列将代表一个时间事件。所以我有事件 1->2->3。我想通过用相同颜色对连接相邻节点的边缘进行着色来展示这次演变。我也有通过 $dist$ 属性传递的节点之间的距离。我编写代码的方式,我无法指定节点号和标签。因此,节点号“1”被分配了一个标签,该标签可能是 time_pres 的 1 以外的某个索引。所以我无法记下哪个节点被分配到哪个标签。
  • time_pres 变量包含哪些值?给我 9,以 3x3 为例。
  • time_pres =[('person1', '1878'), ('person2','1879'), ...] 而 dist 是一个尺寸为 213 X 213 的 numpy 矩阵。
  • 如果我理解正确,请告诉我。如果您有两个带有标签 ('person1', '1878') 和 ('person2', '1879') 以及索引分别为 0 和 1 的节点,那么 time_pres = [('person1', '1878'), ('person2', '1879')]。而dist[0,1] 是 ('person1', '1878') 和 ('person2', '1879') 之间的距离。对吗?

标签: python graph data-visualization networkx


【解决方案1】:

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

所以,我们假设变量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] 之间的距离将由G.add_edge() 中的属性dist=dist[i,j] 决定。实际上,节点的位置是由保存节点的 x 和 y 位置的元组决定的。从manualnx.draw()

pos:字典,可选

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

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

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

然后,节点ij 之间的坐标将导致等于dist[i,j] 的距离。你必须弄清楚这些坐标,但由于你没有明确说明你是如何得出矩阵dist的,所以我不能说什么。

【讨论】:

  • 您好,非常感谢您的解释。我现在似乎很清楚了。虽然我很想知道是否有一种算法可以在给定距离矩阵的情况下自动给我节点坐标。 dist 的解释是这样的:如果我有一个 3X2 矩阵,每列代表一个 2D 向量的节点,我可以创建一个 3X3 维度的距离矩阵(这将是对称的)。
  • 不幸的是,这还不够清楚。它也值得在 Stack Overflow 或 Math Overflow 上提出自己的问题。如果有 200 多个节点,这可能会变得非常复杂。
  • 对不起,在我上面的评论中,3X2 矩阵应该是 2X3。有人告诉我使用 Gephi 进行图形可视化,所以我现在正在学习 Gephi。我希望我能得到解决方案。
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2015-02-05
  • 2019-05-06
  • 1970-01-01
  • 2021-08-17
  • 2015-05-28
相关资源
最近更新 更多