最近因工作原因,需要处理一些数据,顺便学习一下动态图表的绘制。本质是使具有源头的流动信息能够准确找到其上下级关系和流向。

数据来源是csv文件 导入成为dataframe之后,列为其车辆的各部件供应商公司名称或其自身的属性。

导入后经过处理期望是看到整个工业的供应链和市场份额.

结果的部分截图:

数据来源:

核心是将以上数据处理成接口需要的两个数据,一个是所有节点的名称。另一个是节点之间互相链接的值,见下图

NODE: 所有桑基图的节点集合

link: 每一个数据流的起始,结束,与值。

核心统计原理是:

先确定从左到右的统计大纲:在本次案例中为:

接下来就是找大纲序列中当前大类中对应下一级的小类的数目,例: 案例第一步即找最高车速段中 最高车速能力在<180km/h的筛选出来,同时找出低速度段且续驶里程>80km的数量.

统计代码:

# link 数据架构
link=[]
for i in range(len(title)):
temp0=list(class_item)
for j in list(class_item[temp0[i]]):
try:
for k in list(class_item[temp0[i+1]]):
df1=df[df[temp0[i]]==j]
df2=df1[df1[temp0[i+1]]==k]
temp_value=len(df2)
if temp_value!=0:
link.append({'source':j,
'target':k,
'value':temp_value})
del df1
del df2
except:
continue

总代码:

# 数据架构 总领数据架构-品牌-车辆用途-
import matplotlib.pyplot as plt
from pyecharts import Pie,Bar,Page,Bar3D,Overlap,Line,Boxplot,Surface3D,Sankey,EffectScatter
import pandas as pd
import numpy as np
df=pd.read_excel(r'C:\Users\wenzhe.tian\Desktop\数据分析\北理新能源数据v2\02_20190301\2EV_v2.xlsx','Sheet1')
df_ori=df.copy()
#数据处理部分 添加项目,替换重复 格式统一 去掉空格 等
df=df[df.技术类型.str.contains('EV',regex=False)]
df=df.reset_index()
df=df.drop('index',axis=1) #数据格式处理
df['车型分类']=df['车型分类'].fillna('nan')
df=df[~df['车型分类'].isin(['nan'])] # 江淮ES8供应商数据大量缺失,故排除 也可drop
df['电动汽车续驶里程(工况法,km)']=df['电动汽车续驶里程(工况法,km)'].fillna(0)
df['车辆品牌']=df['车辆品牌'].map(str).replace('传祺(Trumpchi)牌','传祺(Trumpchi)牌')
df['通用名称'][df['电动汽车续驶里程(工况法,km)']==0]='ES8'
df['电动汽车续驶里程(工况法,km)'][df['电动汽车续驶里程(工况法,km)']==0]=355
df['电动汽车续驶里程(工况法,km)'][df['电动汽车续驶里程(工况法,km)']=='155(对应整备质量750kg),165(对应整备质量700kg)']=165
df['电动汽车续驶里程(工况法,km)'][df['电动汽车续驶里程(工况法,km)']==170203203]=255
df['电动汽车续驶里程(工况法,km)']=df['电动汽车续驶里程(工况法,km)'].fillna(0)
df['最高车速']=df['最高车速'].astype(int)
df['电动汽车续驶里程(工况法,km)']=df['电动汽车续驶里程(工况法,km)'].astype(int)
df['最高车速段']=df['最高车速'].astype(str)
df['续驶里程段']=df['电动汽车续驶里程(工况法,km)'].astype(str) #df['电池能量密度']=df['电池容量']*df['储能装置总成标称电压(V)']/df['储能装置总成质量(kg)'] df['整备质量(kg)'][(df['整备质量(kg)'].isnull()) | (df["整备质量(kg)"].apply(lambda x: str(x).isspace()))]=2390
# 去掉前后空格
title=list(df)
df['储能装置单体质量(kg)']=df['储能装置单体质量(kg)'].astype(str)
for i in title:
try:
df[i]=df[i].map(str.strip)
except:
continue #重复值处理
df=df.replace('比亚迪汽车工业有限公司,比亚迪汽车工业有限公司', '比亚迪汽车工业有限公司')
df=df.replace('比亚迪汽车工业有限公司/比亚迪汽车工业有限公司', '比亚迪汽车工业有限公司')
df=df.replace('山东德洋电子科技有限公司,山东德洋电子科技有限公司', '山东德洋电子科技有限公司')
df=df.replace('深圳市大地和电气股份有限公司(软件)/深圳市大地和电气股份有限公司(硬件)', '大地和电气')
df['最高车速段'][(df['最高车速']<=180)]='<180km/h'
df['最高车速段'][((df['最高车速']<=200)& (df['最高车速']>180))]='180-200km/h'
df['最高车速段'][(df['最高车速']>200)]='>200km/h' df['续驶里程段'][(df['电动汽车续驶里程(工况法,km)']<=60)]='<60km'
df['续驶里程段'][((df['电动汽车续驶里程(工况法,km)']<=80)& (df['电动汽车续驶里程(工况法,km)']>60))]='60-80km'
df['续驶里程段'][(df['电动汽车续驶里程(工况法,km)']>80)]='>80km'
title=['最高车速段','续驶里程段','车辆用途','企业名称','车型分类','车辆品牌',
'电机生产商','电动汽车整车控制器生产企业','电动汽车车载充电机生产企业','储能装置总成生产企业','车载能源管理系统生产企业'] #无效值处理
for i in title:
df[i]=df[i].astype(str)
df[i]=df[i].map(lambda x: x.replace('有限公司','').replace('股份','').replace('公司','').replace('分','').replace(' Company','').replace(' company','').replace('牌','品牌').replace('北京新能源汽车','北汽新能源'))
df[i]=df[i].map(lambda x: x.replace('浙江','').replace('山东','').replace('广州汽车集团乘用车','广汽').replace('杭州','').replace('江西','').replace('合肥',''))
df[i]=df[i].map(lambda x: x.replace('深圳市','').replace('永康市','').replace('珠海','').replace('郑州','').replace('软件:','').replace('硬件:','').replace('北京:','').replace('长沙市','').replace('金华市',''))
df[i]=df[i].map(lambda x: x.replace('nan','北汽新能源').replace('(','(').replace(')',')').replace('()','').replace('/深圳市大地和电气','').replace('开发企业','').replace('生产企业','').replace('福建省汽车工业集团云度新能源汽车','云度新能源'))
df[i]=df[i].map(lambda x: x.replace('电机1:华域汽车电动系统/电机2:华域汽车电动系统','华域汽车电动系统').replace('前:蔚然(南京)动力科技/后:蔚然(南京)动力科技','蔚然(南京)动力科技'))
if i =='最高车速段':
str_item='最高车速'
elif i =='续驶里程段':
str_item='续航里程'
elif i =='电机生产商':
str_item='MOT'
elif i =='电动汽车整车控制器生产企业':
str_item='MC'
elif i =='电动汽车车载充电机生产企业':
str_item='OBC'
elif i =='储能装置总成生产企业':
str_item='BAT'
elif i =='车载能源管理系统生产企业':
str_item='BMS'
else:
str_item='' df[i]=df[i].map(lambda x: str_item+x) class_item={}
for i in title:
class_item[i]=df[i].drop_duplicates() node=[]
for i in title:
for j in list(class_item[i]):
node.append({'name':j})
# link 数据架构
link=[]
for i in range(len(title)):
temp0=list(class_item)
for j in list(class_item[temp0[i]]):
try:
for k in list(class_item[temp0[i+1]]):
df1=df[df[temp0[i]]==j]
df2=df1[df1[temp0[i+1]]==k]
temp_value=len(df2)
if temp_value!=0:
link.append({'source':j,
'target':k,
'value':temp_value})
del df1
del df2
except:
continue sankey = Sankey("EV供应商链统计",width=6000, height=700)
sankey.use_theme('roma') #roma wonderland
sankey.add(
"EV供应商统计",
node,
link,
line_opacity=0.2,
line_curve=0.3,
line_color='source',
sankey_node_gap=13,
is_label_show=True,
label_pos="right",
is_legend_show =False,
label_text_size=11
)
sankey.render('EV供应商统计_All.html')
del sankey sankey = Sankey("EV供应商链统计",width=6000, height=1500)
sankey.use_theme('roma') #roma wonderland
sankey.add(
"EV供应商统计",
node,
link,
line_opacity=0.2,
line_curve=0.3,
# line_color='source',
sankey_node_gap=13,
is_label_show=True,
label_pos="right",
is_legend_show =False,
label_text_size=12
)
sankey.render('EV供应商统计_All_v2.html')

(之前是用plotly,后来发现pyecharts接口稍微简单些,其实都差不多,但plotyly可以一些特殊地图绘制比pyecharts来的精细,所以看绘图需求吧)

附上链接:https://plot.ly/python/  https://pyecharts.org/#/zh-cn/intro  用于查阅需要绘制的图的种类

python可视化动态图表: 关于pyecharts的sankey桑基图绘制的更多相关文章

  1. ggalluvial|TCGA临床数据绘制桑基图(Sankey)

    本文首发于”生信补给站“,https://mp.weixin.qq.com/s/yhMgkST-rVD6SaQS7R-eoA 桑基图(Sankey diagram),是一种特定类型的流程图,图中延伸的 ...

  2. 【Python可视化】超详细Pyecharts 1.x教程,让你的图表动起来~

    前言 pyecharts 是一个用于生成 Echarts 图表的Python库.Echarts是百度开源的一个数据可视化 JS 库,可以生成一些非常酷炫的图表. Pyecharts在1.x版本之后迎来 ...

  3. 【python可视化系列】python数据可视化利器--pyecharts

    学可视化就跟学弹吉他一样,刚开始你会觉得自己弹出来的是噪音,也就有了在使用python可视化的时候,总说,我擦,为啥别人画的图那么溜: [python可视化系列]python数据可视化利器--pyec ...

  4. 数据可视化之 图表篇(四) 那些精美的Power BI可视化图表

    之前使用自定义图表,每次新打开一个新文件时,都需要重新添加,无法保存,在PowerBI 6月更新中,这个功能得到了很大改善,可以将自定义的图表固定在内置图表面板上了. 添加自定义图表后,右键>固 ...

  5. python可视化pyecharts

    python可视化pyecharts 简单介绍 pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS 库.用 Echarts 生成的图可视化 ...

  6. 开源来自百度商业前端数据可视化团队的超漂亮动态图表--ECharts

    开源来自百度商业前端数据可视化团队的超漂亮动态图表--ECharts 本人项目中最近有需要图表的地方,偶然发现一款超级漂亮的动态图标js图表控件,分享给大家,觉得好用的就看一下.更多更漂亮的演示大家可 ...

  7. 【推荐】开源来自百度商业前端数据可视化团队的超漂亮动态图表--ECharts

    本人项目中最近有需要图表的地方,偶然发现一款超级漂亮的动态图标js图表控件,分享给大家,觉得好用的就看一下.更多更漂亮的演示大家可以参考下面两个网址:ECharts官方网址:http://ecomfe ...

  8. Pycon 2017: Python可视化库大全

    本文首发于微信公众号“Python数据之道” 前言 本文主要摘录自 pycon 2017大会的一个演讲,同时结合自己的一些理解. pycon 2017的相关演讲主题是“The Python Visua ...

  9. 【转】Python 可视化神器-Plotly Express

    转自:https://mp.weixin.qq.com/s/FNpNJSMK5Vs8pwi0PbbBzw 说明:图片无法直接复制,请查看原文 导读:Plotly Express 是一个新的高级 Pyt ...

随机推荐

  1. xxe漏洞分析

    xxe漏洞总结 xxe漏洞就是xml外部实体注入攻击,所以一定是针对xml编写的服务. xxe漏洞是把参数经过php输入流或者$HTTP_RAW_POST_DATA直接读入xml实体当中,参数可控且没 ...

  2. HDU6442(二项式)

    要点 懒得打公式了,题解 把题目要求的复杂公式化简成熟悉的东西,一是看穿前面加个\(n!\)化为\(C_n^i,i为奇数\):二是将奇数的条件去掉的数学技巧. 形为\({(a + b\sqrt{B}) ...

  3. C# 连接oracle,用32位client和64位Client,可能导致结果不同

    在调用过程[pro_regentinitauth]时,有参数3-6为number类型,当我们用这样调用时,在32位client下,能正确得到输出参数3-6的结果为:1023, 但是,当我们把程序部署到 ...

  4. ms sqlserver 清除数据库日志脚本

    USE [master] GO ALTER DATABASE F360DW SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE F360DW SET ...

  5. windows 2008 r2或win7安装SP1补丁,安装sqlserver 2012

    说明:安装sql server 2012时,win7和win2008r2系统都需要打sp1补丁. 1.SP1补丁下载地址(建议用迅雷下载): http://download.microsoft.com ...

  6. 《四 spring源码》手写springmvc

    手写SpringMVC思路 1.web.xml加载  为了读取web.xml中的配置,我们用到ServletConfig这个类,它代表当前Servlet在web.xml中的配置信息.通过web.xml ...

  7. html的文档设置标记上(格式标记)4-5

    <html> <head> <title>第四课的标题及第五课的标题</title> <meta charset="utf-8" ...

  8. Xiaocms 去版权

    Xiaocms 去版权 后台去版权: 1.  登录页面 修改文件:\admin\template\login.tpl.php 代码: <td width="190" rows ...

  9. SpringBoot LogBack文件配置

    <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true&q ...

  10. (转)VC得到可用的串口列表

    //枚举串口 //参数:bEnablePort,哪个串口有效,bEnablePort[0]表示COM1,bEnablePort[n-1]表示COMn //返回值:有效的串口个数 int EnumAll ...