Zexin Li

Please keep honest, open, patient, happy and visionary.

python中使用networkx画图

总述

今天被问了一个问题:如何把复杂的调用树可视化?

首先,这个问题可以被归结为:如何实现有向图的可视化。

当然,答案有很多种。可选的简单地解决方案可能是基于echarts的在线的生成工具 [1],或是Ant V [2]此类专用于画图的框架。本文主要介绍使用python中的networkx宏包作图。

环境配置

python 2.7.17: 依赖库为matplotlib, networkx

1
2
pip install matplotlib
pip install networkx

代码

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
import networkx as nx

G=nx.DiGraph()
list=[(1,2),(1,3),(2,4),("source","end")]
G.add_edges_from(list)
nx.draw(G,with_labels=True)
plt.show()

具体的nerworkx用法参见已有博客 [3]或者networkx官方文档 [4],此处不再赘述。

值得一提的是,虽然python编码相对方便,但是画图的速度远不及基于JavaScript的各种框架。nx.draw(G,with_labels=True)这一行的执行速度非常慢,即使图中只有不超过10个节点也花了近半分钟进行生成。如果需要实时性高的生成,建议使用前文中的[1][2]或类似框架。

效果图

Reference

[1] 利用echarts实现有向图可视化,
http://bookshadow.com/weblog/2016/11/22/echarts-directed-graph-visualization/
[2] AntV, https://antv.vision/en
[3] networkx, https://www.cnblogs.com/ljhdo/p/10662902.html
[4] networkx tutorial,
https://networkx.github.io/documentation/stable/tutorial.html