一张图看懂世界石油分布?用Python轻松搞定!
The following article is from CDA数据分析师 Author 爱用Python的C君
点击上方“Python数据科学”,星标公众号
重磅干货,第一时间送达
CDA数据分析师 出品
作者:Mika数据:真达 后期:泽龙 设计:一凡 2020年的3月注定将载入史册。一边是新冠肺炎疫情在全世界快速扩散,另一边是掌控着世界40%以上油气产量的巨头们撕破脸皮。 面对在OPEC+会议中坚持不再减产的俄罗斯,沙特阿拉伯决意提升石油产能抢占市场,石油价格战毫无征兆地开打。国际原油价格出现大幅波动。3月9日,黑色星期一,世界油价剧烈杀跌,跌幅超过30%。 那么作为现代工业里最重要的命脉,世界石油产量分布究竟如何?谁才是石油界的真正王者呢?中国的石油储量什么水平?今天我们就教你用一张图看懂世界石油分布。
01
02
最早的桑基图
桑基图中的粉色部分描绘了拿破仑军队在欧洲的移动和数量变化情况,显示了在1812年6月,拿破仑带领了42万人入侵俄罗斯。然而随着战争不断深入,军队人数一路减少,到了战败撤退时,只剩下1万人。这张最早的桑基图创建于1869年,但它那时候还不叫桑基图,直到29年后一位爱尔兰船长的出现。
桑基图的命名
1898年,爱尔兰船长马修·亨利·菲尼亚斯·里亚尔·桑基(Matthew Henry Phineas Riall Sankey)使用了这种类型的图表展示了蒸汽的能源效率。与此同时,这个图也以船长的名字命名为“桑基图”。
当时在这张黑白图表只显示了一种类型的流动(如蒸汽); 使用不同颜色能表示不同类型的流动,从而表达出多种变量。 随着时间的推移,桑基图逐渐成为科学和工程中用来表示热平衡、能量流、物质流动的标准模型。 比起普通的流程图或条形图,桑基图体现的数据流动清晰且美观,因此在能源管理、设施管理、过程工程和过程控制等数据可视化方面,桑基图也越来越受欢迎。
03
汽车的能量消耗
国家的能源平衡
这张图是2011年马来西亚的能源平衡。图中流动表示的是“百万吨石油当量”(Mtoe)。
法国公关管理部门资金来源
法国公共管理部门就曾用一张桑基图理清了他们的收支资金来源,以及他们是如何分配这些资金的。最左边的支点代表了不同的资金来源,包括社会、个人税收等。这些资金在汇总到法国的四大公共管理部门后,被再分配到交通、环境保护、住房、教育、文化等各个领域。
04
可见在表示数据流动方面,桑基图十分清晰而且美观。前面我们展示了一张世界石油产量前30国家分布桑基图,下面我们教你就用pyecharts来实现它。
首先需要导入我们需要使用的包,其中pandas用于数据整理,pyecharts用于绘图。
from pyecharts.charts import Sankey
from pyecharts import options as opts
然后使用pandas读入数据,所使用数据来自于BP世界能源统计年鉴-2019版,整理之后的数据使用数据框的形式进行存储,其中state表示国家名称,continent表示大洲名,num表示石油产量(单位百万吨)
df1.head()
桑基图在pyecharts中通过Sankey方法实现,它接受两个外部输入。一个是所有类别的集合-nodes,一个是子类、父类、数据的三方集合-links。也就是说,首先你要把数据转换成Sankey可以接受的形式,下面这个是官网的示例的数据格式:
下面我们写个简单的循环语句,将数据转换成nodes和links形式:
nodes = []
for i in set(pd.concat([df1.state, df1.continent])):
dic_ = {}
dic_['name'] = i
nodes.append(dic_)
# 产生链接
links = []
for x, y, z in zip(df1.state, df1.continent, df1.num):
dic_ = {}
dic_['source'] = x
dic_['target'] = y
dic_['value'] = z
links.append(dic_)
准备好nodes和links后,就可以调用Sankey函数进行绘图,你可以通过配置项otps来设置图表的颜色、标签、标题等信息,具体细节可以去官网查询,这里不做赘述。
官网链接:https://pyecharts.org
s = Sankey(init_opts=opts.InitOpts(width='1350px', height='1350px'))
s.set_colors(colors)
s.add('sankey',
nodes,
links,
pos_left='10%',
pos_right='60%',
linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color='source'),
itemstyle_opts=opts.ItemStyleOpts(border_width=1, border_color="#aaa"),
tooltip_opts=opts.TooltipOpts(trigger_on="mousemove"),
is_draggable=True,
label_opts=opts.LabelOpts(position="left",
font_family='Arial',
margin=10,
font_size=13,
font_style='italic')
)
s.set_global_opts(title_opts=opts.TitleOpts(title='世界石油产量top30国家分布'))
s.render()
生成html文件后,直接通过浏览器打开即可,就可以看到能交互的桑基图了,生成的图形如下:
以上这就是成品啦,是不是效果十分惊艳呢!快来自己试试吧!
参考资料:
What is a Sankey diagram?
https://www.ifu.com/en/e-sankey/sankey-diagram/
Wikipedia :Matthew Henry Phineas Riall Sankey
https://en.wikipedia.org/wiki/Matthew_Henry_Phineas_Riall_Sankey
Wikipedia : Sankey diagram
https://en.wikipedia.org/wiki/Sankey_diagram
油价暴跌对我们意味着什么?
近期精选
重磅!首款 Jupyter 官方可视化 Debug 工具,JupyterLab 未来可默认支持 Debug
帝国理工最新报告:疫情后人类社会将进入“周期性停摆-重启”循环,我们回不去了?