我试图绘制运行脚本的任何网络的图形。我使用scapy收集数据包,并希望每台计算机通信有一个节点,每个连接有一个边缘。
问题是我找不到在屏幕上足够形象地显示图形的方法。到目前为止,将networkx与matlib.pyplot结合使用可带来最佳结果,但看起来仍然是随机且混乱的,标签难以读取,节点彼此重叠,等等。最好还具有与图进行交互的能力-移动节点,将鼠标悬停在节点/边上以获得更多信息,放大或什至将节点群集在一起,以便在单击群集时可以看到由哪些节点组成集群。
由于对网络数据进行分析并向图中添加节点和边会很麻烦,因此我仅在此处添加相关部分(实际上显示了我构建的图的部分):
pos = nx.spring_layout(Graph, scale=2)
edge_labels = nx.get_edge_attributes(Graph, "Protocol")
nx.draw(Graph,pos, with_labels=True, node_size=600, font_size=8, font_weight='bold')
nx.draw_networkx_edge_labels(Graph, pos, edge_labels=edge_labels, font_size=8)
plt.show()
(我将网络导入为nx,将matplotlib.pyplot导入为plt)
我还尝试了graphviz,plotty和bokeh,但无法真正使它们正常工作,在对Google进行故障排除后,我觉得无论如何他们都无法解决我的问题,并且我还尝试了AdjustText-但我无法适应它以任何方式(找不到我的图形的text属性)和Holoviews出现在我的代码中-但无论如何尝试,它都拒绝显示图像(即使我从其网站复制并粘贴示例,也可以python表示'%opts ...'是无效的语法,或者如果我尝试以其他方式更改选项,则代码将一直运行直到结束并在屏幕上不显示任何内容。
我在网上找到了很多局部解决方案,所以它们都不起作用,有人有全面的解决方案吗?
答案 0 :(得分:0)
您可以调整nx.spring_layout
的超参数(k和迭代)以排列节点。调整参数后,连接的节点将彼此靠近,并且未接触的节点将保持最大可能的距离。
pos = nx.spring_layout(G,k=0.1, iterations=20)