Python绘图技巧

ECharts绘图解决方案——流动关系图(桑基图)

2019-10-05  本文已影响0人  szu_bee

应用场景

用流动关系图来映射品牌之间的有效换机数量,从而帮助运营对手机品牌的行情做分析和预测。

  • 图形说明
    • 一期:图形中间为分析主品牌;左侧为流入品牌,曲线粗细=换机数大小(流入量);右侧为流向品牌信息,曲线粗细=换机数大小(流出量);
    • 二期:为降低信息复杂度,中间品牌支持切换为单个品牌(观察品牌)。

最终实现效果如下图所示:

实现

  • 确定使用的基本图表类型及数据格式:使用桑基图,数据格式编码为节点列表和边列表。
  • 确定节点和边的样式、交互效果:不同品牌的节点和边需要明显的颜色区分;鼠标hover到边上时显示对应的品牌流向关系和有效换机数量。
  • 中间品牌支持切换为单个品牌(观察品牌)。
  • 支持观察品牌两边的颜色与两侧对照品牌颜色一致。
  • 支持鼠标hover到中间品牌时,单独查看其中一个对照品牌与观察品牌的流动关系,其他品牌图形信息置灰。

问题及解决方案

问题一:流入、中间、流出的品牌存在同名情况,而ECharts桑基图只支持有向无环图。

展示的品牌流动关系需要明确分为三列:流入品牌、中间品牌和流出品牌,而这三列存在名称重复的情况,即需要查看品牌A流入/流出品牌A自身(持机)的数量,然而根据series-sankey.links的配置规则,桑基图只支持有向无环图,“自身流向自身”显然是有环的,因此不支持直接输入所有流向关系。

问题二:位于不同列的同品牌节点颜色需保持一致。

然而基于问题1的解决方案,对所有节点加入特定标记处理后,ECharts已将所有节点识别为互不关联的不同节点,因此均会会默认按不同节点来处理。

问题三:中间节点为单一节点时,边的颜色配置问题。

需要支持观察品牌两边的颜色与两侧对照品牌颜色一致。
而根据series-sankey.lineStyle的配置,lineStyle.color仅支持设置'source'或者'target'特殊值,或者一个单独的颜色值如'#314656',那么如果仅在外层lineStyle设置color: 'source'或'target',会导致有一侧的所有边颜色为单一颜色,如下图所示。

问题四:数据量级差异过大导致的交互体验问题。

在二期改造中,中间节点固定为一个时,放大了一个因为数据量级差异过大导致的交互体验问题:其中一边的线条过细且较密,交互区域过小且容易与其他边互相影响,如下图所示。


由于存在数据量级相差至少十倍的情况,导致部分线条过细

经对多组数据的观察,发现出现这种情况的原因是某些品牌的流入/流出其中一边的数据量级普遍是另一边的数十上百倍,边的粗细问题也因按比例渲染而受量级影响。

问题五:ECharts配置不支持鼠标hover到一个节点时,指定特定的相邻边高亮或置灰。

需要支持鼠标hover到中间品牌时,单独查看其中一个对照品牌与中间品牌的流动关系,其他品牌信息置灰。
而ECharts4.x开始支持的focusNodeAdjacency属性只支持批量设定相邻的一侧或所有边、节点的高亮,无法单独指定,如下图所示。

focusNodeAdjacency: "inEdges"("outEdges"效果类似)
focusNodeAdjacency: "allEdges"

效果样例

以上生成的配置项均可直接粘贴在https://echarts.apache.org/examples/zh/editor.html?c=line-simple查看效果。

上一篇下一篇

猜你喜欢

热点阅读