【问题标题】:How to assign node names to a matrix Networkx?如何将节点名称分配给矩阵 Networkx?
【发布时间】:2020-03-04 11:03:19
【问题描述】:

我正在尝试在 NetworkX 中绘制图表。该网络连接了 30 个节点和大约 130 条边。 使用带权重的矩阵设置节点

A = [
    [0, 1.51, 0, 1.71, 0],
    [0, 0, 2.11, 1.81, 2.31],
    [0, 0, 0, 1.31, 1.41],
    [0, 0, 0, 0, 1.11],
    [0, 0, 0, 0, 0]]

如何将列表("A1", "K2", ... "Z30")中的节点名称分配给矩阵? 到目前为止,我只能为数字指定名称。

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

A = [[0, 1.51, 0, 1.71, 0],
     [0, 0, 2.11, 1.81, 2.31],
     [0, 0, 0, 1.31, 1.41],
     [0, 0, 0, 0, 1.11],
     [0, 0, 0, 0, 0]]

G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)

layout = nx.spring_layout(G)
labels = nx.get_edge_attributes(G, "weight")
lab_node = dict((i, str(i)*3) for i in range(5))
nx.draw(G, layout)
nx.draw_networkx_nodes(G, layout, node_size=500)
nx.draw_networkx_edge_labels(G, layout, edge_labels=labels)
nx.draw_networkx_labels(G, layout, labels=lab_node, font_size=10, font_family='sans-serif')
plt.show()

【问题讨论】:

    标签: python networkx


    【解决方案1】:

    作为一种简单的解决方法,您可以将邻接矩阵 A 转换为 pandas DataFrame,其列/索引是您想要的标签:

    import pandas as pd
    import networkx as nx
    
    A = [
        [0, 1.51, 0, 1.71, 0],
        [0, 0, 2.11, 1.81, 2.31],
        [0, 0, 0, 1.31, 1.41],
        [0, 0, 0, 0, 1.11],
        [0, 0, 0, 0, 0]]
    
    labels = ['alice', 'bob', 'charlie', 'dan', 'ellie']
    

    创建数据框:

    A2 = pd.DataFrame(A, index=labels, columns=labels)
    

    通过绘制检查结果,无需额外设置标签(表明我们已经设置正确):

    nx.draw_networkx(nx.from_pandas_adjacency(A2))
    

    【讨论】:

    • 这对 OP 所需的标签语法没有帮助。
    • 这是他们在示例中提供的标签语法。
    • 而且,他们只需要提供标签列表 - 他们想要的任何列表。
    • @AKX 无论如何,我已经根据您的评论编辑了我的答案以澄清。
    【解决方案2】:

    如果您的问题只是绘图,您可以使用以下方法:

    import matplotlib.pyplot as plt
    import networkx as nx
    import numpy as np
    
    A = [[0, 1.51, 0, 1.71, 0],
         [0, 0, 2.11, 1.81, 2.31],
         [0, 0, 0, 1.31, 1.41],
         [0, 0, 0, 0, 1.11],
         [0, 0, 0, 0, 0]]
    
    G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)
    
    layout = nx.spring_layout(G)
    labels = nx.get_edge_attributes(G, "weight")
    # lab_node = dict((i, "A") for i in range(5))
    
    # a list of the node labels in the right order
    raw_labels = ["A1", "K2", "D3", "E4", "Z30"]
    lab_node = dict(zip(G.nodes, raw_labels))
    
    nx.draw(G, layout)
    nx.draw_networkx_nodes(G, layout, node_size=500)
    nx.draw_networkx_edge_labels(G, layout, edge_labels=labels)
    nx.draw_networkx_labels(G, layout, labels=lab_node, font_size=10, font_family='sans-serif')
    plt.show()
    

    如果您想重命名图表中的节点,您可能正在寻找relabel_nodes 方法。

    【讨论】:

      猜你喜欢
      • 2020-03-06
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      相关资源
      最近更新 更多