Networkx中大型网络的可视化问题

时间:2019-06-06 08:05:19

标签: python networkx

我有一个很大的Python数据框,正试图从中建立一个网络。我有一个source_node(具有大约10个唯一值)和一个target_node(具有数千个值)。我正在寻找例如source_node_1到多个目标节点。至少可以这样说,目前,我对网络的可视化并不理想。

结果如下:

what the result looks like

这是用于创建网络的代码:

df = pd.DataFrame({
    'source_node':['sc1','sc2','sc2'],
    'target_node':['tg1,tg2,tg3','tg10','tg2,sc1']
}) 
df['splitted_targets'] = df['target_node'].apply(lambda x: x.split(','))

G = nx.DiGraph()

for r in df.iterrows():
    for user in r[1]['splitted_targets']:
        G.add_edge(r[1]['source_node'], user)

nx.draw(G, with_labels=True)

是否有一种简单的方法例如为每个唯一的source_node及其target_nodes创建10个图,还是创建一个可读的简化图?

1 个答案:

答案 0 :(得分:1)

逻辑上如此巨大的图看起来就像是一团糟。在具有每个节点5000个节点的FullHD监视器上,一个节点的总数不得超过:

sqrt(1920 * 1080 / 5000) = 20

一个20x20像素的图像,用于节点,文本标签和所有可能的边缘。而且,人脑is very bad在操纵with this amount of data时,即使有人绘制了巨大的图形,他也将无法正确地对其进行分析。

在您的情况下,您的源节点数量很少,每个源节点都有数千个目标节点。如果只删除链接到一个源节点的所有目标节点,则可以极大地减小图形的大小(请记住,您仍将拥有此信息,以后可以通过打印对其进行分析与特定源节点相对应的所有目标节点):

G.remove_nodes_from([
    n
    for n in G.nodes
    if n not in df['source_node']
    if G.degree(n) < 2
])

所以最终的代码将是:

df = pd.DataFrame({
'source_node':['sc1','sc2','sc3'],
'target_node':['tg1,tg2,tg3,sc2','tg10,tg2,sc3','tg2,sc1'] }) 

df['splitted_targets'] = df['target_node'].apply(lambda x: x.split(','))

G = nx.DiGraph()
for r in df.iterrows():
    for user in r[1]['splitted_targets']:
        G.add_edge(r[1]['source_node'], user)
print(list(list(G.neighbors(n)) for n in G.nodes))
G.remove_nodes_from([
    n
    for n in G.nodes
    if n not in df['source_node']
    if G.degree(n) < 2
])
nx.draw(G, with_labels=True)

此图:

enter image description here

将减少为:

enter image description here

我确信对于您而言,这将有很大帮助,因为您只有几十个源节点。您还可以播放节点大小,节点标签,字体等。