首先來回答一個問題,什麼是桑基圖?
不廢話,先上東西:
上面這個圖片就是【桑基圖】,桑基圖的一個典型特徵就是能量的分流,數據按照一定的規則呈現結構化的分佈,它主要包括三個部分:節點、節點之間的鏈接、節點鏈接的數據。
桑基圖對於數據分析師來說應用非常廣泛,因為數據分析師的工作就是把繁雜的數據一層層拆解,最終找到引發問題出現的原因,例如流量拆解、GMV拆分、消費者預估等等。
怎樣快速做出一個多層級的桑基圖?
pyecharts 是用 Python 寫的可視化工具包,調用簡單,操作方便。
第一步:安裝 pyecharts
<code>pip
install pyecharts/<code>
第二步:導入工具包
<code>import
pandasas
pdfrom
pyechartsimport
optionsas
optsfrom
pyecharts.chartsimport
Sankey/<code>
第三步:導入數據
<code>nodes = [ {"name"
:"總客戶"
}, {"name"
:"新客"
}, {"name"
:"老客"
}, {"name"
:"一次老客"
}, {"name"
:"二次老客"
}, {"name"
:"三次老客"
}, ] links = [ {"source"
:"總客戶"
,"target"
:"新客"
,"value"
: 500}, {"source"
:"新客"
,"target"
:"一次新客"
,"value"
: 500}, {"source"
:"總客戶"
,"target"
:"老客"
,"value"
: 300}, {"source"
:"老客"
,"target"
:"二次老客"
,"value"
: 100}, {"source"
:"老客"
,"target"
:"三次老客"
,"value"
: 100}, ]/<code>
第四步:生成圖表
<code>sankey = Sankey() sankey.add
("sankey"
, nodes, links, linestyle_opt=opts.LineStyleOpts(opacity=0.2
, curve=0.5
, color="source"
), label_opts=opts.LabelOpts(position="right"
), ) sankey.set_global_opts(title_opts=opts.TitleOpts(title="Sankey-基本示例"
)) sankey.render_notebook()/<code>
除了安裝包之外,三步就可以生成一個桑基圖。下面我來解釋一下,Sankey 這個類當中的參數:
- "sankey" 圖表的名稱
- nodes 節點數據,格式為json
- links 節點之間的連接,格式為json
- linestyle_opt / opacity 不透明度
- linestyle_opt / curve 彎曲程度
- linestyle_opt / color 配色
主要的一點要注意,nodes 和 links 一定要滿足規定的條件格式,一般數據源都是在excel 或者在數據庫中保存,接下來我們要做的是:怎樣把本地數據源,變成可用的數據格式
先看下我們的數據源:
這個數據源就是文章開頭那個桑基圖的數據,它包含了兩個層級,所以,第一步我們要做的是,構建nodes(節點)數據:
<code>df_columns = list(df.columns)[:-1
] node_list = []for
column in df_columns: df_node = df[column].unique()for
node in df_node: dic = {} dic['name'
] = node node_list.append
(dic)'name'
:'消費者'
}, {'name'
:'新客'
}, {'name'
:'老客'
}, {'name'
:'連衣裙'
}, {'name'
:'褲子'
}, {'name'
:'襯衫'
}, {'name'
:'T恤'
}, {'name'
:'針織衫'
}, {'name'
:'外套'
}, {'name'
:'運動鞋'
}, {'name'
:'休閒鞋'
}, {'name'
:'低幫鞋'
}, {'name'
:'拖鞋'
}, {'name'
:'跑鞋'
}]/<code>
第二步構建links:
把【客戶屬性】和【一級類目】組合,完成第一層級的數據,以便達到下面的效果:
<code>客戶屬性
一級類目
購買人數
0
消費者
新客
2021
1
消費者
老客
2628
/<code>
再把第二層級拿出來,與第一層的數據組合起來,完整代碼如下:
<code>df_lv1 = df.groupby(['客戶屬性'
,'一級類目'
]).sum() df_lv1 = df_lv1.reset_index() df_lv2 = df.iloc[:,1
:] df_lv1.columns = ['from'
,'to'
,'data'
] df_lv2.columns = ['from'
,'to'
,'data'
] df_links = pd.concat([df_lv1, df_lv2]) links_list = []for
link
in df_links.values: link_dict = {} link_dict["source"
] =link
[0
] link_dict["target"
] =link
[1
] link_dict["souvaluerce"
] =link
[2
] links_list.append(link_dict)/<code>
最後,把組合好的數據放入模板當中:
<code>new_sankey = Sankey() new_sankey.add
(""
, node_list, links_list, linestyle_opt=opts.LineStyleOpts(opacity=0.2
, curve=0.5
, color="source"
), label_opts=opts.LabelOpts(position="right"
), ) new_sankey.set_global_opts(title_opts=opts.TitleOpts(title="新老客購買類目"
)) new_sankey.render_notebook()/<code>
就形成了文章開頭的圖片樣式。
數據可視化涉及到的圖表類型還有很多,之後會陸續為大家更新。