首页 > 解决方案 > Networkx中大型网络的可视化问题

问题描述

我有一个大型 Python 数据框,我正在尝试从中构建网络。我有一个source_node(大约有 10 个唯一值)和一个 target_node(有数千个值)。我正在研究例如source_node_1到多个目标节点的传出交互。目前,至少可以说,我对网络的可视化并不理想。

结果如下所示:

结果是什么样的

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

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和它的创建 10 个图形target_nodes,或者创建一个可以读取的简化图形?

标签: pythonnetworkx

解决方案


如此巨大的图表看起来像一个可怕的混乱是合乎逻辑的。在每个节点有 5000 个节点的全高​​清显示器上,一个节点不超过:

sqrt(1920 * 1080 / 5000) = 20

用于节点、文本标签和所有可能边缘的 20x20 像素的图像。而且,人脑对这么多数据的处理能力很差,即使画出巨大的图表,也无法正确分析。

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

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)

而这张图:

在此处输入图像描述

将减少为:

在此处输入图像描述

我相信在你的情况下它会有很大帮助,因为你只有几十个源节点。您还可以使用节点大小、节点标签、字体等。


推荐阅读