如何解决建立网络模型
我对如何创建具有以下特征的网络有疑问:
A B
12 [32,12,45]
2 [43,41,2,15]
15 [15,18,24,1]
1 [1,7]
其中A列中的数字和B列中的数字是节点。我想在A和B中对应的值之间找到联系;然后,将B中的元素连接到A或彼此连接。例如:
- 12与自身链接(由于没有其他节点与之链接,因此被隔离);
- 2与自身和15相关联;
- 15与自身以及1和2相关联;
- 1与自身链接(隔离)
如何绘制?
我认为我应该使用explode;我对边缘列表使用了错误的方法:
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)
解决方法
我对这种类型的图几乎没有经验,但是我用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,15],[15,18,24,[1,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()
,
根据您的要求,您不仅需要使用explode,还需要过滤要保留的唯一节点集的数据(否则它将绘制所有可用的节点)。
要求-
- 12与自身链接(由于没有其他节点与之链接,因此被隔离);
- 2与自身和15相关联;
- 15与自身以及1和2相关联;
- 1与自身链接(已隔离?-并不是,15连接到1)
您可以执行以下操作来处理数据-
df = pd.DataFrame({'A':[12,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,1]
如果要使用自循环实现图,则需要使用Graphviz对其进行绘制,如本SO post
所述版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。