最近做项目需要做一个流量流向图,之前见过一种图,但是,死活不知道这个图叫啥,寻求多方帮助之后,才得知,原来叫桑基图。
呐,就是它
桑基图(Sankey diagram),即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。因1898年Matthew Henry Phineas Riall Sankey绘制的“蒸汽机的能源效率图”而闻名,此后便以其名字命名为“桑基图”。
话不多说,直接开始,用Pyecharts绘制桑基图
环境
python 3.6 pyecharts 1.9.0
案例源码
数据量有点大就不展示数据了,直接展示画图的源码
nodes = []
for i in range(2):
vales = df.iloc[:, i].unique()
for value in vales:
dic = {}
dic['name'] = value
nodes.append(dic)
print(nodes)
linkes=[]
for i in df.values:
dic={}
dic['source'] = i[0]
dic['target'] = i[1]
dic['value'] = i[2]
linkes.append(dic)
pic = (Sankey().add(
'', #图例名称
nodes, #传入节点数据
linkes, #传入边和流量数据
#设置透明度、弯曲度、颜色
linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.5, color='source'),
#标签显示位置
label_opts=opts.LabelOpts(position='right'),
#节点之间的距离
node_gap=80,
)
.set_global_opts(title_opts=opts.TitleOpts(title='装卸流量流向图'))
)
pic.render('test.html')
在生成桑基图之后,可以直接打开,如果打开的是空白的,好像是要装个什么(具体有点忘记了),请自行百度解决,一搜就有。
但是当你的类分的比较多之后,会出现一个问题,所有的线和边都是一般大的。
这样丝毫体现不出数据的大小区别,尝试改变节点之间的距离,增大之后,会发现整个图就显示不全了,猜测是限定了画板的大小,但是,并没有找到可以更改画板大小的参数,就只能向源码下手了。
查看类Sankey部分的源码,可以发现,它只有一个add方法。从参数来看,这并不是我们要找的图表大小设置。
但是,类Sankey继承至类Chart,这个类有set_colors,set_series_opts等方法
除此外,它的初始化函数__init__中,接受参数init_opts,这个参数的默认值为opts.InitOpts()。再查看这个的源码。
然后就找到了我们想要调整的参数了,里面定义了画板的大小,因为我只需要画板的大小参数,就没有研究其他的参数,感兴趣或者有需求的可以自己去研究其他的参数。
接下来,将参数width、height放入代码中重新运行,查看是否可以更改画板的大小。
pic = (Sankey(
init_opts=opts.InitOpts(
width='1800px',
height='2000px'
)
).add(
'', #图例名称
nodes, #传入节点数据
linkes, #传入边和流量数据
#设置透明度、弯曲度、颜色
linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.5, color='source'),
#标签显示位置
label_opts=opts.LabelOpts(position='right'),
#节点之间的距离
node_gap=80,
)
.set_global_opts(title_opts=opts.TitleOpts(title='装卸流量流向图'))
)
pic.render('test.html')
运行发现整个桑基图都变大了,想要的结果已经出来了。
参考文章:https://blog.csdn.net/H_biubiu/article/details/105380326