python 桑基图 地理坐标_【转载】Python数据可视化-实现Sankey桑基图
根據不完整統計,90%想用sankey圖的朋友都是因為被它炫酷的外表所吸引,舉個例子:
在這里插入圖片描述
關于sankey圖的定義是這樣描述的:
即桑基能量分流圖,也叫桑基能量平衡圖。它是一種特定類型的流程圖,圖中延伸的分支的寬度對應數據流量的大小,通常應用于能源、材料成分、金融等數據的可視化分析。
流程圖的一種
由若干個三元素組成(節點,邊,流量)
遵循守恒定律,無論怎么流動,開端和末端數據始終一致
下面我們來簡單實現一個Sankey圖
第一步,我們先收集數據。
這里我在2020意大利新冠肺炎案例統計收集了意大利的患者年齡分布。
我們用pandas庫來繪制統計表。當然也可以用excel保存為xlsx文件。
db1 = pd.DataFrame({
'country':['Italy','Italy','Italy','Italy'],
'ages':['18歲以下','19-50歲','50-70歲','70歲以上'],
'confirm':['1677','31394','43617','43139'],
'Deceased':['167','408','4492','34813'],
'Active/Recovered': ['1510','30986','39125','8326']
})
print(db1)
那么打印下統計表得到:
country ages confirm Deceased Active/Recovered
0 Italy 18歲以下 1677 167 1510
1 Italy 19-50歲 31394 408 30986
2 Italy 50-70歲 43617 4492 39125
3 Italy 70歲以上 43139 34813 8326
如果是要讀入excel保存的表格那么只要簡單的一行命令:
db1 = pd.read_excel('statistik.xlsx)
第二步,我們開始處理數據
畫圖按照Sankey圖的規則,需要定義節點,邊,流量。
可以理解為兩個數據結構:nodes和links。
在這個案例,所有節點就是:Italy,18歲以下,19-50歲,50-70歲,50-70歲,confirm,Deceased,Active/Recovered
我們用一個字典嵌套的鏈表來儲存:
nodes=[]
for i in range(2):
values = db1.iloc[:,i].unique()
for value in values:
dic={}
dic['name'] = value
nodes.append(dic)
nodes.append({'name':'Deceased'})
nodes.append({'name':'Active/Recovered'})
[{'name': 'Italy'}, {'name': '18歲以下'}, {'name': '19-50歲'},
{'name': '50-70歲'}, {'name': '70歲以上'}, {'name': 'Deceased'},
{'name': 'Active/Recovered'}]
然后定義邊和流量,數據從哪里流向哪里,流量為多少,按照source-target-value的格式保存。我們用循環加字典可以輕松搞定
links = []
for i in db1.values:
dic={}
dic['source']=i[0]
dic['target']=i[1]
dic['value']=i[2]
links.append({'source':i[0],'target':i[1],'value':i[2]})
links.append({'source':i[1],'target':db1.keys()[3],'value':i[3]})
links.append({'source':i[1],'target':db1.keys()[4],'value':i[4]})
print(links)
[{'source': 'Italy', 'target': '18歲以下', 'value': '1677'},
{'source': '18歲以下', 'target': 'Deceased', 'value': '167'},
{'source': '18歲以下', 'target': 'Active/Recovered', 'value': '1510'},
{'source': 'Italy', 'target': '19-50歲', 'value': '31394'},
{'source': '19-50歲', 'target': 'Deceased', 'value': '408'},
{'source': '19-50歲', 'target': 'Active/Recovered', 'value': '30986'},
{'source': 'Italy', 'target': '50-70歲', 'value': '43617'},
{'source': '50-70歲', 'target': 'Deceased', 'value': '4492'},
{'source': '50-70歲', 'target': 'Active/Recovered', 'value': '39125'},
{'source': 'Italy', 'target': '70歲以上', 'value': '43139'},
{'source': '70歲以上', 'target': 'Deceased', 'value': '34813'},
{'source': '70歲以上', 'target': 'Active/Recovered', 'value': '8326'}]
nodes和links定義好了之后,就已經完成了80%
第三步,繪圖
我們可以使用pyecharts的庫來實現,這一段代碼幾乎是固定的格式
from pyecharts.charts import Sankey
from pyecharts import options as opts
pic = (
Sankey().add('',
nodes,
links,
linestyle_opt=opts.LineStyleOpts(opacity = 0.3, curve = 0.5, color = 'source'),
label_opts=opts.LabelOpts(position = 'top'),
node_gap = 30,
)
.set_global_opts(title_opts=opts.TitleOpts(title = '意大利新冠肺炎病患年齡分布'))
)
pic.render('test.html')
好了,到這來大功告成,運行python文件,最后會生成一個test.html。
用瀏覽器打開就可以欣賞做出來的的sankey圖:
在這里插入圖片描述
總結
以上是生活随笔為你收集整理的python 桑基图 地理坐标_【转载】Python数据可视化-实现Sankey桑基图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker mysql详解_Docke
- 下一篇: python tcp server分包_