绘制桑基图
但是关于数据流上的数据标签可能还得用ps…
注意
1、节点(nodes)要包括各层的,且不能重复,需要自己在后边append几个数据
2、数据流的数据要是整数,不能时numpy
3、注意表格加入时要再由array转为list(说白了还是基础不扎实,导致花很多时间调整)
资料参考
♥※第三方可视化数据分析图表Pyecharts(下载保存图片(生成的html图片)、zip函数(将数据转换为列表加元组的格式)、南丁格尔玫瑰图、双y轴可视化、饼形图和环形图):关于pyechart的设置恨恨恨详细!!!
- jupyter lab下用pyecharts生成桑基图显示空白
- pyechart数据可视化丨制作桑基图(sankey)的最简单方法
python数据可视化Pyecharts库sankey修改桑葚图颜色
python绘制桑基图(sankey diagram)
数据
代码
import os
from pyecharts import options as opts
from pyecharts.charts import Sankey
import pandas as pd
import numpy as np
import json
#事先把数据存好了格式为 研究期初、研究期末、数据
data1 = pd.read_excel(r'E:\...移矩阵 - 副本.xlsx',encoding = "gbk", index_col = "研究期初")
data2 = pd.DataFrame()
data2["研究期初"] = data1.index
data2["研究期末"] = list(data1["研究期末"].values)
data2["面积"] = data1["面积"].values
# 生成nodes
nodes2 = []
# 先导入部分节点
for i in data2["研究期初"].unique():
dic = {}
dic['name'] = i
nodes2.append(dic)
nodes2.append({'name':'2021年水体'})
nodes2.append({'name':'2021年沙洲'})
nodes2.append({'name':'2021年边滩'})
links2 = []
# 组成字典
for i in data2.values:
dic = {}
dic['source'] = i[0]
dic['target'] = i[1]
dic['value'] = int(i[2])
links2.append(dic)
#绘制图片
c = (
Sankey(init_opts=opts.InitOpts(width="1200px", height="800px",theme='westeros'))
.add(
"",
nodes=nodes2, # 结点
links=links2, # 联系
linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
label_opts=opts.LabelOpts(position="right"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="闽清闽侯段"))
.render(r"E:\b-研究生学习\5-课题组\1-2022 闽江\3-数据资料\data_area\ABC.html")
)
结果
设置图片颜色和字体大小
图片颜色
for i in data2["研究期初"].unique():
dic = {}
dic['name'] = i
if i.split("年")[1] == "水体":
dic['itemStyle']={'color':"#00BFFF"}
elif i.split("年")[1] == "沙洲":
dic['itemStyle']={'color':"#FFA500"}
else:
dic['itemStyle']={'color':"#FFFF00"}
nodes2.append(dic)
nodes2.append({'name':'2021年水体','itemStyle':{'color':"#00BFFF"}})
nodes2.append({'name':'2021年沙洲','itemStyle':{'color':"#FFA500"}})
nodes2.append({'name':'2021年边滩','itemStyle':{'color':"#FFFF00"}})
字体大小
label_opts=opts.LabelOpts(position="right",font_size=(20)),)
添加工具箱,用来下载图片
pic = (
Sankey(init_opts=opts.InitOpts(width='700px',height='400px', # 设置画布大小
bg_color='#fff')) #设置画布底色,保证打印下来图片正常
.add("",
nodes2,
links2,
linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source",type_="dotted"),
node_gap=50,
label_opts=opts.LabelOpts(position="right",font_size=(17)),)
#.set_global_opts(title_opts=opts.TitleOpts("闽清闽侯段"))
)
结果2
最后代码:
# -*- coding: utf-8 -*-
"""
Created on Thu Mar 2 10:30:34 2023
1、绘制桑基图
2、保存出图
@author: hp
"""
import os
from pyecharts import options as opts
from pyecharts.charts import Sankey
import pandas as pd
import numpy as np
import json
data1 = pd.read_excel(r'E:\b-研究生学习\5-课题组\1-2022 闽江\3-数据资料\data_area\闽清闽侯段转移矩阵 - 副本.xlsx',encoding = "gbk", index_col = "研究期初")
data2 = pd.DataFrame()
data2["研究期初"] = data1.index
data2["研究期末"] = list(data1["研究期末"].values)
data2["面积"] = data1["面积"].values
# 生成nodes
nodes2 = []
# 添加其他节点
for i in data2["研究期初"].unique():
dic = {}
dic['name'] = i
if i.split("年")[1] == "水体":
dic['itemStyle']={'color':"#00BFFF"}
elif i.split("年")[1] == "沙洲":
dic['itemStyle']={'color':"#FFA500"}
else:
dic['itemStyle']={'color':"#FFFF00"}
nodes2.append(dic)
nodes2.append({'name':'2021年水体','itemStyle':{'color':"#00BFFF"}})
nodes2.append({'name':'2021年沙洲','itemStyle':{'color':"#FFA500"}})
nodes2.append({'name':'2021年边滩','itemStyle':{'color':"#FFFF00"}})
links2 = []
for i in data2.values:
dic = {}
dic['source'] = i[0]
dic['target'] = i[1]
dic['value'] = int(i[2])
links2.append(dic)
# c = (
# Sankey(init_opts=opts.InitOpts(width="1200px", height="800px",theme='westeros'))
# .add(
# "",
# nodes=nodes2, # 结点
# links=links2, # 联系
# linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source"),
# label_opts=opts.LabelOpts(position="right"),
# )
# .set_global_opts(title_opts=opts.TitleOpts(title="闽清闽侯段"))
# .render(r"E:\b-研究生学习\5-课题组\1-2022 闽江\3-数据资料\data_area\ABC.html")
# )
pic = (
Sankey(init_opts=opts.InitOpts(width='700px',height='400px', # 设置画布大小
bg_color='#fff')) #设置画布底色,保证打印下来图片正常
.add("",
nodes2,
links2,
linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source",type_="dotted"),
node_gap=50,
label_opts=opts.LabelOpts(position="right",font_size=(17)),)
#.set_global_opts(title_opts=opts.TitleOpts("闽清闽侯段"))
)
pic.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True,pos_left=500)) # 工具箱离容器左侧的距离
pic.render('problem.html')
os.system('problem.html')