如何修改networkx图分布和可视化?

时间:2016-04-20 17:16:51

标签: python plot network-programming networkx

我实施了一个Networkx图来分析我的数据,但由于它在公司(链接中的第一列数据)和代理(链接中的第二列数据)之间存在巨大的组合,因此情节不明确。

如何修改绘图以减少节点的重叠?

数据: https://www.dropbox.com/s/vc7ivgbrbluv6ed/data_to_plot.txt?dl=0

我的代码:

import networkx as nx
import matplotlib as plt
import pandas as pd
import os
import pylab

# load the data    
network_to_plot = pd.read_csv('data_to_plot.txt',sep=" ", header = None)

# formatting the data
agents_vector = [tuple(x) for x in network_to_plot.to_records(index=False)]

# start the graph
G = nx.DiGraph()

G.add_edges_from(agents_vector)

pos=nx.spring_layout(G)
nx.draw(G,pos,edge_cmap=plt.cm.Reds)
pylab.savefig("network_based_on_firms.png")

结果:

enter image description here

2 个答案:

答案 0 :(得分:1)

图表中节点的位置由函数spring_layout确定,请参阅文档链接。

您可以从增加用于计算最佳位置的迭代次数开始。我认为你也可以设置比默认值更低的k(1 / sqrt(节点))。

如果这些失败,您可以查看additional networkx layout calculators

答案 1 :(得分:0)

两种可能的途径。
一种是使用更好的布局功能,可能是shell_layout()或circular_layout() 另一个是理解布局功能产生的结构,并使用您对数据的理解来产生更明智的可视化。 这些函数生成一个键入节点的字典,其值为长度为2.第一个条目指定节点的x位置,第二个条目指定y。 举个例子,办公室之间的网络连接图。

pos=nx.spring_layout(G)
print pos

可能会产生类似

的内容
{'A': [1, 12], 'C': [5, 8], 'B': [4, 11], 'E': [8, 3], 'D': [8, 7], 'F': [6, 1]}

但是,我知道由于我的数据代表了citites,因此在代表其物理位置的位置显示节点是有意义的,所以我建立了自己的字典。

pos = {}
for node in G.nodes():
    pos[node] = [G.node[node]["x"], G.node[node]["y"]]

您似乎很好地掌握了数据。使用它对您有利。在您的具体情况下,似乎有两个主要类别,代理商和公司。也许可以将图表可视化分为3列:“代理”和“代理”。区域和边缘区域'以及'公司'区。遍历节点并分配沿适当区域向下锯齿的X和Y值(边缘区域中没有节点,允许连接清晰)。对于许多节点,数据仍然可能非常模糊。也许根据连接数给节点额外的Y填充。 摆弄比例和其他模式,你应该能够产生一些值得关注的东西。将最少的代理组织到底部,然后将所有代理连接到代理区域的底部。然后继续前进到下一家公司,将尚未安置的所有代理商连接到那家公司,依此类推。将每个公司置于其映射的代理区域的中间y值。选择是无止境的。