需求
仍然是关系图的展示,前面用到的vis.js在显示两个节点间多个关系时的表现有些鸡肋,同时布局切换时没有动画效果(节点逐渐移动边随之移动),这一周特尝试了sigma.js,它在布局切换时的动画很吸引人,但是同样的问题,不支持两节点多个关系的展示,所以也是从入门到放弃了,下面会分别就 sigma.js 来谈谈问题
- 两节点间同方向多个关系的展示
- 布局切换动画效果
问题分析
两节点间同方向多个关系的展示
生成曲线边的时候,发现使用的是贝塞尔曲线来画线,除了已知起始点坐标,我们需要知道一个控制点坐标,在 sigma.js 中,算法根据起始点坐标计算出一个控制点,所以只要坐标不变,无论几条边,控制点永远是一个,这样就导致边重合在一起
1 | sigma.utils.getQuadraticControlPoint = function(x1, y1, x2, y2) { |
布局切换动画
sigma.js 的切换动画真的很吸引人,我是通过 gephi 进行布局,生成节点的坐标,并生成为 json 导出,sigma.js 的动画需要将不同的坐标放在一个 json 中,使用不同的前缀区分。这样我在做的时候需要读每个布局文件然后取出节点坐标,根据id追加到对应的节点对象中,将不同布局的节点坐标存进去。个人认为,如果不需要对关系图进行很强的数据操作,只求显示效果好的话,sigma.js真的是一个不错的选择
1 | for (i = 0; i < N; i++) { |
cytoscape.js
完美支持两节点间多个关系的显示,这点 vis.js 和 sigma.js 都没有很好的支持.
1 | var cy = cytoscape({ |
这是切换布局的动画,读json并获取对应id的坐标,使用动画移动到响应的位置,后面需要生成历史的话,可以根据sigma.js的思路来做.
1 | fetch('data.json', {mode: 'no-cors'}) |
data.json我就不贴了,按照格式自己写几条测试两节点间多条边的数据即可
总结
布局的动画切换这个部分其实还是手动了,如果只需要更改layout对应参数就能使点移动会更加完美,不过手动也好,学习深度会增加,有时间一定要看看如何实现的两节点间多条变不重合,看看贝塞尔的控制点是如何变的。