背景

近日有个需求是向用户更好地展示网络图及其属性,之前使用的 networkx 库可以处理图数据但画出来的图是静态的且不具备良好的交互性,因此想找一个交互性好的网络图绘制工具。

目前了解的基于 Python 语言绘制动态图的库包括但不局限于以下几种:

  • Ployly
  • PyEcharts
  • AnyChart
  • PyVis

其它绘图软件 Gephi 和 Pajek 提供非常好的绘图效果但不支持源码操作,本文注重 Python 源码绘图工具。

以下仅体验这几种不同工具的绘制效果来进行比较选择,因此不附加任何源码,如需请参考提供的官方链接。


更新线:

bqplot

参考另一篇博客:Python 完美交互的网络图可视化工具库

Jaal

前端提供一些图属性操作,参考源码:https://github.com/imohitmayank/jaal

dashboard 示例

Plotly

著名的 python 交互式图表可视化库,但其绘制 network graph 图局限性较大,以下参考官方教程示例。

https://plotly.com/python/network-graphs/#

简单的图绘制结果如下,节点可以显示标签及其连接度

Plotly network graph

仅可以对整个图使用缩放功能,但是不可将节点拖动。

当然有其它解决方法来绘制节点可拖动的图,结果如下所示

Dash graph

但是其基于 dash 库 pip install dash dash-cytoscape,感觉稍微有点麻烦而且不提供对 notebook 的支持。

详细参考官方教程:https://plotly.com/python/

PyEcharts

Echarts 是百度开源的图表可视化项目,对 JavaScript 支持效果非常好,同时也提供了 Python 接口 pyecharts。

https://pyecharts.org/#/zh-cn/basic_charts?id=graph%ef%bc%9a%e5%85%b3%e7%b3%bb%e5%9b%be

Pycharts 绘制的关系图如下所示,除了显示节点和边的标签外,可以高亮当前选中的节点和边,但其基于图布局不可以随意拖动节点。

pyecharts graph

当然也可以达到其它更加绚丽的效果,📢 图根据布局还可以是动态展示的看起来更加炫!

参考:https://gallery.pyecharts.org/#/Graph/README

pyecharts graph pyecharts graph

AnyChart

AnyChart 这个项目的图展示效果非常符合我对图的需求,节点和边的形状、标签信息可以高度定制化,而且节点可以任意拖动,可以基于 Java、Scala、JavaScript、Python等语言使用。

https://docs.anychart.com/Basic_Charts/Network_Graph

以下列举几个官方给的示例,

AnyChart graph AnyChart graph

虽然 AnyChart 支持 Python,但是需要配合 Django、MySQL 一起使用就有点复杂,这个库比较适合中大型项目的图展示。对于日常图效果展示有点杀鸡用牛刀了!

PyVis

PyVis 是一个可交互的图可视化库,可以以 networkx 格式的图作为输入进行展示。

https://pyvis.readthedocs.io/en/latest/

提供了基本的节点显示和操作,可以有不同的布局,展示结果如下所示

pyvis

个人感觉图展示美化效果稍微 low 一点但基本符合需求,因此目前先采用这个库来做可视化,后续在使用过程中再进行更新其缺点。