python 桑基图,python
在用python做桑吉的图的过程中,我的老板曾经发了下面这个图来问有没有可能做这样的图。当时刚培训完大数据,四处打听童鞋的情况,也没发现这个图是怎么做的。一个偶然的日子,我在看微信官方账号的时候,看到一篇用Python画桑吉的文章。我试了一下,果然能画出桑吉图。在这里我整理了一下,分享给大家。
三吉图怎么说三吉图?百度是这样描述的:
桑基图,即桑基能量分流图,也叫桑基能量平衡图。它是一种特定类型的流程图,其中扩展分支的宽度与数据流的大小相对应,通常用于能源、物质构成、财务等数据的可视化分析。它因马太亨利菲尼亚斯里尔桑基于1898年绘制的“蒸汽机能效图”而闻名,此后被命名为“桑吉图”。
科普完了,接下来,我们来做点实际工作。我们用python画个三吉图吧。三吉图有哪些成分?击中要害。三吉图的本质是由节点,边,流量组成,永远不变。
制作三级图接下来,我们以“创意李公馆待售产品”的数据为例:
先整理一下基础数据。
导入panda为pddf=pd.dataframe ({type: [遥控,遥控,遥控,非遥控],产品名称:[机器人, slam racing , Lyken racing ,机器人
产品种类及数量0遥控机器人151遥控slam赛车232遥控莱卡赛车363非遥控机器人484非遥控slam赛车215非遥控莱卡赛车11接下来我们用pyecharts画图。
步骤1:节点
首先将所有涉及到的节点重新组织在一起,即在列表中以嵌套字典的形式将类型列中的“遥控”和“非遥控”以及产品名称列中的“机器人”、“slam racing”和“Lyken racing”重新汇总:
范围(2)中I的nodes=[]:vales=df . iloc[:I]。值中值的unique():DIC={ } DIC[ name ]=value nodes . append(DIC)print(nodes)输出结果:
[{name :遥控器}、{name :非遥控器}、{name :机器人}、{name :满贯赛车}、{name :莱肯赛车}]
步骤2:定义边和流。
linkes=[]for I in df . values:DIC={ } DIC[ source ]=I[0]DIC[ target ]=I[1]DIC[ value ]=I[2]linkes . append(DIC)输出结果:
[{ 源:遥控,目标:机器人,值:15},
{ 源:遥控,目标:砸车,值:23},
{ 源:遥控,目标:莱肯赛车,值:36},
{ 源:非遥控,目标:机器人,值:48},
{ 源:非遥控,目标:砸车,值:21},
{source :非遥控, target: Lyken Racing , value: 11}]
源-目标-值字典格式清楚地描述了数据流。
第三步:敲出画图代码。
来自肾盂造影。图表从pyecharts导入sankey导入选项作为opts pic=(sankey()。Add(,# legend name nodes,# incoming node data linkes,# Incoming edge and traffic data # Set transparency,curvature,color linestyle _ opt=opts。Linestyleopts(不透明度=0.3,曲线=0.5,颜色=源),#标签显示位置label _ opts=opts。Labelopts (position= right ),#节点间距离node _ gap=30,)。set _ global _ opts(title _ opts=opts。title opts (title=创意李公馆产品分类图))pic.render(test.html )打开生成的test.html文件,该检查结果了:
问题来了。想垂直显示图片该怎么做?很简单,只需要在添加函数中添加一个orientation= vertical :
Pic=( Sankey()。add(,# legend name nodes,# incoming node data linkes,# incoming edge and flow data # Set transparency,curvature line style _ opt=opts . line style opts(opacity=0.3,curve=0.5,color= source ),# label display position label _ opts=opts . labeopts(position= right ),node _ gap=30,orientation= vertical ,#查看垂直图片的操作)。set _ global _ opts(title _ opts=opts。title opts (title=创意李大厦
有三级循环的时候怎么办?请继续往下看。
第一步:准备数据。
导入熊猫为pddf=pd.dataframe ({ 产品名称:[机器人, slam racing , Lyken racing ,机器人, slam racing , Lyken racing],第一次购买:[遥控机器人,遥控slam racing ,遥控莱"非遥控Lycan Racing"],"第二次购买":[不买,买,买,买,买,数量:[12,23,45,32,11,12]})打印(df)产品名称:第一次购买,第二次购买数量121 slam车遥控slam车;232莱肯车遥控slam车;453机器人非遥控机器人;324 slam车非遥控slam车;115莱肯汽车遥控slam车;12第二步:删除节点并汇总,对以上节点稍作修改。
范围(3)中I的节点=[]:#由vales=df.iloc [:I]修改。值中值的unique():DIC={ } DIC[ name ]=value nodes . append(DIC)Print(nodes)打印结果:
[{姓名:机器人}、{姓名:slam赛车}、{姓名:Lycan赛车}、{姓名:遥控机器人}、{姓名:遥控slam赛车}、{姓名:遥控Lycan赛车。{name :非遥控slam赛车}、{name :非遥控Lycan赛车}、{name :未购买}、{name :已购买}]
第三步:由于linkes只接受source-tray-value的格式,所以需要先形成“产品名称-第一次购买-数量”和“产品名称-第二次购买-数量”的样式,然后统一汇总:
first=df.groupby([产品名称,首次购买]) [数量]。sum()。reset _ index () second=df.iloc [:1:] first.columns=[source , target , value]。Target , value] result=pd.concat ([first,second]) print (result。头(6)) SourceTargetvalue0机器人遥控机器人121机器人非遥控机器人322 Slash赛车遥控Slash赛车233 Slash赛车非遥控Slash赛车114 Lycan赛车遥控Lycan赛车455 Lycan赛车非遥控Lycan赛车12第4步
linkes=[]for I in result . values:DIC={ } DIC[ source ]=I[0]DIC[ target ]=I[1]DIC[ value ]=I[2]linkes . append(DIC)打印结果:
[{ 源:机器人,目标:遥控机器人,值:12},
{ 源:机器人,目标:非远程机器人,值:32},
{ 源:砸车,目标:遥控砸车,值:23},
{source: slam racing , target : slam racing without remote control , value: 11},
{source: Lyken Racing , target :遥控Lyken Racing , value: 45},
{ 源:莱肯赛车,目标:非遥控莱肯赛车,值:12},
{ 源:遥控机器人,目标:未购买,值:12},
{ 源:遥控摔车,目标:买,值:23},
{ 源:遥控lycan赛车,目标:未购买,值:45},
{ 源:非远程机器人,目标:购买,值:32},
{ 源:非遥控slam赛车,目标:未购买,值:11},
{ 源:非遥控莱卡赛车,目标:购买,值:12}]
第五步:输入绘图代码。
Pic=( Sankey()。add(,# legend name nodes,# incoming node data linkes,# incoming edge and flow data # Set transparency,curvature line style _ opt=opts . line style opts(opacity=0.3,curve=0.5,color= source ),# label display position label _ opts=opts . labeopts(position= right ),node _ gap=30,# orientation= vertical ,#查看垂直图片的操作)。set _ global _ opts(title _ opts=opts。title opts (title=创意李公馆产品分类图))pic.render(test.html )搞定。看输出结果。
最后,我们来看看这篇分析的主角。
XB-21001砰然遥控赛车
遥控地平线机器人
喜欢的朋友用淘宝扫描下方二维码,进店查看详情。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。