背景
桑基图作为1种表达数据流动方向的可视化方式,在商业数据分析,地理可视化,生物医学领域有着广泛应用。比如:在基因组学领域,有研究利用桑基图来表示生物分子之间的调控关系。
目前多数桑基图软件包(如plotly等)大多数调用了d3.js,它允许提供一些可交互操作,但安装和使用的参数设定有一定不便利。
matplotlib是python内最为流行的一个可视化库,提供大量的操作接口,其绘制的图片可以达到文章发表级别,美观程度不亚于ggplot2。然而,matplotlib并没有提供一些高级绘图函数接口,需要用户对matplotlib非常熟悉才能绘制出定制化程度高的图。
一些高级封装库,如:Seaborn封装了matplotlib,有助于降低用户使用难度,绘制高级的图片,且允许用户后期调用matplotlib api自由修改。但seaborn依然没有桑基图绘制。
介于此,本人基于matplotlib开发了一个简单的桑基图绘制程序pysankey2,它能够绘制多层桑基图,并允许用户自由的设定一些参数,熟悉matplotlib也可以后期进行修图。
下面介绍如何利用pysankey2来绘制桑基图。
安装
安装非常简单,下载地址:https://github.com/SZJShuffle/pySankey2/releases/download/v0.1.0/pysankey2-0.1.0.zip
下载后,打开操作系统的命令行界面,cd到存放该压缩包的目录,然后利用pip就能完成安装:
cd path/to/your/directory
pip install pysankey2-0.1.0.zip
3行代码绘制一个2层桑基图
我们基于内置的数据集进行快速绘制:
from pysankey2.datasets import load_fruits
df = load_fruits()
df.head()
可以看到,内置数据集的每一行代表一个连接对。有几个连接对,就有几行。实际上,这也是pysankey2的输入要求。
import matplotlib.pyplot as plt
import pandas as pd
from pysankey2 import Sankey
## colorMode="global"表示设置箱子的颜色是全局一致的。
## 例如:Orange无论在第几层,都使用同样的颜色
sky = Sankey(df,colorMode="global")
fig,ax = sky.plot()
当然,字体好像有点小,颜色也不是很好看。我们进行一下微调,颜色更改为Paste1
配色,并且利用stripColor="left"
把桑基条带的颜色设置为和左边的箱子一样,同时把字体调大一点:
import matplotlib.pyplot as plt
import pandas as pd
from pysankey2.datasets import load_fruits
from pysankey2.utils import setColorConf
from pysankey2 import Sankey
df = load_fruits()
fruits = list(set(df.layer1).union(set(df.layer2)))
# Specified the colors.
# Here, we use 'Pastel1' colormaps(a shy but fresh palette:)).
# See matplotlib cmap for more colormaps:
# https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html
colors = setColorConf(len(fruits),colors='Pastel1')
cls_map = dict(zip(fruits,colors))
# set stripColor="left"
sky = Sankey(df,colorDict=cls_map,colorMode="global",stripColor='left')
# set a bigger font size
fig,ax = sky.plot(text_kws={'size':20})
是不是好看多了~算下来一共也就6行代码。
绘制一个3层桑基图
df = load_countrys()
sky_auto_global_colors = Sankey(df,colorMode="global")
fig,ax = sky_auto_global_colors.plot(text_kws={'size':15})
效果如下:
其他参数
pysankey2还支持字体位置、箱子位置、间隙等绘图参数设置,更多的用法可以参考演示文档:
https://github.com/SZJShuffle/pySankey2/blob/master/example/pySankey2_demo.ipynb
如果有任何疑问,可以直接到github页面提issue或者邮件联系[email protected] 。