Loading...
墨滴

yuanzhoulvpi

2021/08/01  阅读:75  主题:橙心

python绘制sankey图

背景

最近因为工作需要,需要画一些漏斗图、成交路径的图之类的,然后我就想到了桑基图(sankey diagram)。这个图现在绘制很简单,可以有以下几个方法:

  1. 使用R语言画,比如R语言的networkD3、plotly包,可以画非常漂亮的sankey diagram图,使用起来也很方便,但是我不想用,因为我不想从python到R相互转化,变量之间的传递太麻烦了,虽然现在的jupyter notebook可以配置,让R和python共享变量。但是我个人感觉不够优雅。 参考链接有:https://www.r-graph-gallery.com/321-introduction-to-interactive-sankey-diagram-2.html

  2. python的matplotlib也可以画,但是matplotlib画的图很难交互,做静态展示还是非常可以的,但是交互起来非常麻烦,尤其是涉及到sankey diagram这样的,要展示的指标非常多。所以说使用matplotlib就不方便。我也选择放弃。 参考链接有:https://matplotlib.org/stable/api/sankey_api.html

  3. python的pyecharts、plotly包也可以画。但是plotly的图总是感觉不够中国化,不够本土,然后就没有选择plotly。pyecharts图也还行,就是学习起来感觉有点麻烦,要配置的东西太多,每次要导入几行代码,也不够优雅,更加致命的是pyecharts画出来的图没有官方的echarts图好看。 参考链接有: https://pyecharts.org/#/zh-cn/intro

ok,总结就是没有一个我就是非常懒、非常挑剔。不想用别人的东西。我要找一个为我深度定制的工具🔧,因此我直接为我自己做了一个python脚本,这个脚本方便我直接生成含有sankey diagram的html文件。

明确目的

在动手之前我的目的是什么,我想要什么,我觉得有这几点:

  1. 要方便,必须在几行代码内,可以直接将我的数据制作成sankey diagram。
  2. 展示要优雅,我需要传递极少的参数,就可以把我的sankey diagram图做的非常漂亮,色彩搭配要非常好。
  3. 要交互,鼠标放在上面,我就可以看到详情。

基于我现有的技术水平和我的目标,我权衡了一下,最终得到一个完整的解决办法:

  1. 直接使用JavaScript的echart包。
  2. 使用python控制字符串生成html文件。
  3. python内部将数据处理转换好,只要传递一个pandas的数据框就可以出结果。

具体的操作步骤

我先去echart的官方,找一找案例:https://echarts.apache.org/examples/zh/index.html#chart-type-sankey

看到案例后,我选择一个图,刚好看到一个案例非常好看,然后我将这个图的案例里面的代码下载下来。https://echarts.apache.org/examples/zh/editor.html?c=sankey-energy

下载下来的代码是一个简单的html文件,经过我的对html的结构的了解之后,我把这个html结构整理好,加了一点点细节:主要是将数据部分都放到JavaScript里面的数据对象里面。

这个html文件里面目前只需要传递三个对象即可,分别是sankey diagram的node、link、title。然后将这个这个html搞成字符串形式放到python的一个对象里面。

这个python每次只要接收到一个含有source、target、value三列的数据框,然后会自动从这个数据框提取出html需要的node和links,然后将提取出来的node、links转化成html需要的json样式。

总结:

  1. python负责处理数据,提取数据,将数据保存到字符串中,并且将一个字符串转换成html文件。
  2. html中的JavaScript是负责echart包的数据展示部分,用来控制前段网页的数据分发。

使用这个包

我这个包已经上传到我的GitHub上,链接为:https://github.com/yuanzhoulvpi2017/tiny_python/tree/main/Echarts_Plot

需要注意的是,要有这个generate_sankey.py文件,然后打开【绘制sankey0801.ipynb】就有详细的教程。

在【绘制sankey0801.ipynb】中,我们需要这几个步骤:

  1. 导入包,肯定要导入我的这个generate_sankey包
  1. 处理数据,这个处理数据具体看个人情况,处理之后的数据需要是三列,第一列是列名叫source,字符串类型;第二列列名叫target,也是字符串类型;第三列列名叫value,数值型。
  1. 处理到sankey对象中,这个要使用SanKey类创建一个对象,在SanKey里面设置好数据,设置好sankey diagram的标题。然后运行这个对象,最终将这个对象保存到html文件中。
  1. 运行结束之后,就可以查看这个文件了,电脑端浏览如下:

  2. 手机也可以查看这个sankey diagram吗?也可以查看.

最后

  1. 后续如果需要,可以添加更多更加复杂的功能。
  2. GitHub指路:https://github.com/yuanzhoulvpi2017/tiny_python/tree/main/Echarts_Plot

yuanzhoulvpi

2021/08/01  阅读:75  主题:橙心

作者介绍

yuanzhoulvpi