如何使用Python绘制易读且最好是可交互的网络图?

11

我正在尝试画出运行我的脚本的任何网络的图表。我使用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()

(我将networks导入为nx,matplotlib.pyplot导入为plt)

我还尝试了graphviz、ploty和bokeh,但无法使它们正常工作。在Google上进行故障排除后,我得出的结论是它们不会修复我的问题。我还尝试了adjustText,但无论如何都无法将其适合到我的代码中(找不到如何获取图形的文本属性),以及Holoviews - 但无论我尝试什么方法,它都拒绝显示图像(即使我复制并粘贴他们网站上的示例 - 要么Python说“%opts...”是无效语法,要么如果我尝试以其他任何方式更改选项,则代码只运行直到结束,屏幕上没有显示任何内容)。

这是图形的样子:This is what the graph looks like

我在网上找到了许多部分解决方案,所以它们都不起作用,有人有全面的解决方案吗?


2
几年前,我放弃了尝试使用你提到的所有工具,转而使用了 d3 。https://github.com/d3/d3-force - keithpjolley
2
你有没有看过Vega及其相关工具?可以查看这个交互式示例或一个力导向图。不确定Vega-liteAltair是否也能做到...然后还有更早的Lyra(示例)或GraphScapegraph-tool(不是Vega)也非常好用,而且速度很快。 - jdehesa
你要绘制的网络中有多少个节点/边? - abc
很难说有多少节点 - 取决于将使用这些产品的公司中有多少台计算机。 或者 - 取决于这些公司中有多少子网/虚拟局域网(正在研究几个选项) 因此,我估计数量在几十到几千之间。我将做出的决定还取决于我找到的解决方案是否能够扩展以处理这些不同的规模。关于其他评论 - 我会将这些选项添加到我的待办列表中,并在此处发布另一条评论。 - yo1122
1
首先,我要不要脸地宣传一下 netgraph。它最初是基于 networkx 绘图工具的一个分支,但是它可以让你在绘制节点后移动它们。它还可以自动缩放标签,使其适合节点内部。API非常相似,所以你不应该遇到任何问题。 - Paul Brodersen
显示剩余3条评论
2个回答

1
使用plt绘制复杂的图表可能会有些问题,问题不仅在于数据,而且人眼难以一次性获取大量信息。 我的建议是使用更高级的图形可视化库,例如ipycytoscape。您可以使用它定义样式和更多特性,以满足您的需求。
from ipycytoscape import CytoscapeWidget
graph_draw = ipycytoscape.CytoscapeWidget()
graph_draw.graph.add_graph_from_networkx(nx_graph, directed=True)

此外,如果您将使用 CytoscapeWidget,您可以与图形进行交互,并将视图的焦点匹配到您最感兴趣的部分。

0

您可以调整nx.spring_layout的超参数(k和迭代次数)来排列节点。一旦您调整了参数,连接的节点将彼此靠近,未连接的节点将保持最大可能的距离。

pos = nx.spring_layout(G,k=0.1, iterations=20)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接