【问题标题】:Building a network model建立网络模型
【发布时间】:2020-08-15 03:18:07
【问题描述】:

我有一个关于如何创建具有以下特征的网络的问题:

A            B
12     [32, 12, 45]
2      [43, 41 ,2,15]
15     [15,18,24,1]
1      [1,24,7]

其中 A 列中的数字和 B 中的数字是节点。我想找到 A 和它们在 B 中的对应值之间的联系;然后,将 B 中的元素连接到 A 或相互连接。例如:

  • 12 与自身链接(孤立,因为没有其他节点与其链接);
  • 2与自身和15相连;
  • 15与自身和1和2相连;
  • 1 与自身链接(隔离)

如何绘制它?

我想我应该使用explode;我对 edgelist 使用了错误的方法:

G = nx.from_pandas_edgelist(df, 'A', 'B')
plt.figure(3,figsize=(30,24)) 
nx.draw(G, node_size=200, with_labels=False)
pos = nx.spring_layout(G) 
nx.draw(G, pos = pos)

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我对这种类型的图表几乎没有经验,但我已经使用explode() 实现了列表扩展,并在 matplotlib 中创建了一个图表,其中 A 列和 B 列作为路径。

    import pandas as pd
    import numpy as np
    import io
    
    df = pd.DataFrame({'A':[12,2,15,1], 'B':[[32, 12, 45], [43,41,2,15], [15,18,24,1], [1,24,7]]})
    df = df.explode('B', ignore_index=True)
    
    import matplotlib.pyplot as plt
    import networkx as nx
    
    G = nx.DiGraph()
    nx.add_path(G, df['A'])
    nx.add_path(G, df['B'])
    
    nx.draw_networkx(G)
    plt.show()
    

    【讨论】:

    • 请问您是否使用第一列的方向,即df['A']?例如,12 连接到 32 和 45(外向箭头)。 15 连接到18,24,1(传出);因为2 连接到[43, 41,15],所以15 也有一个输入箭头。我不知道这是否有意义。看24,和15没有链接,好像很奇怪
    • 我不知道回复您的评论。我认为用这段代码再次询问是一回事。这里有很多经验丰富的专家。
    【解决方案2】:

    根据您的要求,您不仅需要使用explode by,还需要过滤要保留的唯一节点集的数据(否则它将绘制所有可用节点)。

    要求 -

    • 12 与自身链接(孤立,因为没有其他节点与其链接);
    • 2与自身和15相连;
    • 15与自身和1和2相连;
    • 1 与自身相连(孤立? - 不是真的,15 与 1 相连)

    您可以执行以下操作来处理数据 -

    df = pd.DataFrame({'A':[12,2,15,1], 'B':[[32, 12, 45], [43,41,2,15], [15,18,24,1], [1,24,7]]})
    df = df.explode('B')
    
    vocab = set(df['A'].unique()).intersection(set(df['B'].unique()))
    df = df[df['B'].isin(vocab)]
    print(df)
    
    #leaving only the nodes that have existing connections.
        A   B
    0  12  12
    1   2   2
    1   2  15
    2  15  15
    2  15   1
    3   1   1
    

    然后您可以简单地使用 networkx 从 Source-Target 数据帧中进行绘图。

    G = nx.from_pandas_edgelist(df, 'A', 'B')
    nx.draw_networkx(G)
    plt.show()
    

    检查自循环 -

    print("Nodes with self loops:",list(G.nodes_with_selfloops()))
    
    Nodes with self loops: [12, 2, 15, 1]
    

    如果你想用自循环实现绘图,那么你需要使用 Graphviz 来绘制它,如 SO post 中提到的那样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      相关资源
      最近更新 更多