背景
想学习用pyechart画网络图(Graph)。
参考:
官方文档
https://pyecharts.org/#/zh-cn/intro
官方示例:
https://github.com/pyecharts/pyecharts-gallery
遇到的第一个问题:
运行不报错,但是打开生成的html,标题可以显示,没有图形。
查找资料发现可能是因为找不到静态资源文件。
这个问题参照官方文档就可以解决:资源引用。
其中,pyecharts-assets 项目保存到能找得到的文件夹都行(最好在自己常用的画图文件夹下,方便找)。HTTP file server在系统终端启动(在IDE终端启动没反应),之后每次从这个文件服务器取数据终端都会有一行输出。
遇到的第二个问题:
上述操作成功之后,图形依然没出来。
也就是说,有了依赖的资源,还是画不出来,所以应该是代码本身也有问题。
经过各种尝试,发现是opt.GraphNode的category这个参数用的不对。我给每个节点设置了分类,但是在绘图时Graph.add()中没有配置categories参数,导致渲染时并不明确有哪些类型的节点,分别应该绘制成什么样。
# 节点配置语句
nodes_data.append(opts.GraphNode(name=node,symbol_size=10,value=node,category=_type))
# 图中的配置
c = (
Graph(init_ops)
.add(
"",
nodes_data,
links_data,
# ...其他配置省略
# (之前没写的部分)指定每个类别节点的配置
# 只指定name则会按照当前主题的默认样式配置各个类别节点
categories = [{
name:"type1"
},
{
name:"type2"
},]
)
遇到的第三个问题
这样终于打开html可以看到图了!
但是用大一点的数据(一万多个节点)画图时,导出的html文件(才二十M)加载不出来。
这不太对劲,因为之前画别的图,六七十M的html也能打开。
我试着把opt.InitOpts()里的renderer="svg"删了,也就是改用默认的“canvas”。导出的文件大小没变,但是打开文件后,浏览器渲染很快就完成了。
关于svg和canvas的区别目前学习了一下,但感觉理解的还不透彻,在这里就不多写了。不过可以明确的是,由于canvas是位图,像素级的渲染,不涉及到DOM,所以对于大数据量的情况渲染速度更快。svg由于是矢量图,操作对象是元素,所以在静态图片放大缩小时不会失真(比如地图),但由于DOM的使用,对于复杂大数据的渲染会比较慢。
效果图
这是使用默认的力引导布局,筛出了大概1000个节点做的demo的效果。
(比较考验电脑性能,一万个左右节点在我电脑上进行缩放和交互就有些卡顿了)
抓紧时间去学习啦,代码如果有需要我再整理吧。