數據可視化專題:再炫酷的桑基圖,三步就能完成

首先來回答一個問題,什麼是桑基圖?

不廢話,先上東西:

數據可視化專題:再炫酷的桑基圖,三步就能完成

上面這個圖片就是【桑基圖】,桑基圖的一個典型特徵就是能量的分流,數據按照一定的規則呈現結構化的分佈,它主要包括三個部分:節點、節點之間的鏈接、節點鏈接的數據。

桑基圖對於數據分析師來說應用非常廣泛,因為數據分析師的工作就是把繁雜的數據一層層拆解,最終找到引發問題出現的原因,例如流量拆解、GMV拆分、消費者預估等等。

怎樣快速做出一個多層級的桑基圖?

pyecharts 是用 Python 寫的可視化工具包,調用簡單,操作方便。

第一步:安裝 pyecharts

<code>

pip

install pyecharts/<code>

第二步:導入工具包

<code>

import

pandas

as

pd

from

pyecharts

import

options

as

opts

from

pyecharts.charts

import

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)

print

(node_list) ----------------------------------------- [{

'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>

就形成了文章開頭的圖片樣式。

數據可視化涉及到的圖表類型還有很多,之後會陸續為大家更新。


分享到:


相關文章: