【问题标题】:Networkx does not return a nice graph from adjacency matrixNetworkx 没有从邻接矩阵返回一个漂亮的图
【发布时间】:2019-12-10 14:45:52
【问题描述】:

我有一个矩阵如下:

adjacency_matrix = [['A', 1, 1, 0, 2], ['B', 1, 1, 1, 3], ['C', 0, 0, 1, 1]]

表明A在“元素1”、“元素2”中,但不在“元素3”中,因为它有1、1和0。

B 是“元素 1”、“元素 2”和“元素 3”,因为所有值都是 1 等。最后一个值是该子列表中 0 和 1 的总和。

我创建了一个 pandas 数据框以将其保存到 csv 文件中。在保存之前,它会按总和对其进行排序,然后删除最后一列(总和)。

df = pd.DataFrame(adjacency_matrix, columns = ["Name", "Element 1", "Element 2", "Element 3", "Sum"])
df = df.sort_values(by=['Sum'], ascending=False)
df = df.iloc[:, :-1]

我的下一步是使用邻接矩阵并创建一个漂亮的连接图。

G=from_pandas_edgelist(df, source="Name", target=["Name", "Element 1", "Element 2", "Element 3"])
nx.draw_circular(G, with_labels=True)
plt.axis('equal')
plt.show()

我做错了什么?我没有得到“A”连接到元素 1 和元素 2 的无向图。我感觉我的源和目标是错误的。

【问题讨论】:

    标签: python pandas networkx graph-theory adjacency-matrix


    【解决方案1】:

    将您的邻接矩阵重构为边缘列表。这是一个使用DataFrame.melt 和DataFrame.query 的示例:

    df = pd.DataFrame(adjacency_matrix, columns = ["Name", "Element 1", "Element 2", "Element 3", "Sum"])
    df = df.sort_values(by=['Sum'], ascending=False)
    df = df.iloc[:, :-1]
    
    df_edges = (df.melt(id_vars='Name', var_name='target')
                .query('value==1'))
    

    [出]

      Name     target  value
    0    A  Element 1      1
    1    B  Element 1      1
    3    A  Element 2      1
    4    B  Element 2      1
    7    B  Element 3      1
    8    C  Element 3      1
    
    
    G = nx.from_pandas_edgelist(df_edges, source='Name', target='target')
    nx.draw_networkx(G)
    

    【讨论】:

    • 我得到“.rename(columns=lambda x: f'Element{x}' if x > 0 else 'source') TypeError: '>' not supported between 'str'实例和 'int'" 你使用的 adjacency_matrix 例子和我的例子一样吗?
    • 抱歉,请参阅更新 - 我直接从你的邻接处 list
    【解决方案2】:

    我的方法是重构您的 adjacency_matrix 以包含所有对:

    adjacency_matrix = [['A', 1, 1, 0, 2], ['B', 1, 1, 1, 3], ['C', 0, 0, 1, 1]]
    
    df = pd.DataFrame(adjacency_matrix, columns = ["Name", "Element 1", "Element 2", "Element 3", "Sum"])
    df = df.sort_values(by=['Sum'], ascending=False)
    df = df.iloc[:, :-1]
    
    df = df.set_index('Name')
    
    edges = df.columns
    
    for i in df.index:
        df[i] = [0 for _ in range(len(df.index))]
    
    for e in edges:
        r = [0 for _ in range(len(df.columns))]
        df.loc[len(df)] = r
    
    
    as_list = df.index.tolist()
    as_list[len(adjacency_matrix):] = edges
    df.index = as_list
    
    
    G=nx.from_pandas_adjacency(df)
    nx.draw_circular(G, with_labels=True)
    plt.axis('equal')
    plt.show()
    

    如下制作你的df:

               Element 1  Element 2  Element 3  B  A  C
    B                  1          1          1  0  0  0
    A                  1          1          0  0  0  0
    C                  0          0          1  0  0  0
    Element 1          0          0          0  0  0  0
    Element 2          0          0          0  0  0  0
    Element 3          0          0          0  0  0  0
    

    这给出了:

    【讨论】:

      猜你喜欢
      • 2022-07-10
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      相关资源
      最近更新 更多