python高端实现各国GDP动态轮换图
前言效果
今天我们来试一下用python实现世界各国从1960-2018年的各国的GDP展示效果!也许大家会觉得有用!
一、准备数据等文件
二、完整代码
1.准备showGDP.py
代码如下:
#coding=utf-8
#
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import PlotUtil
import platform
import sys
def is_country(x, fields):
if "v2" in sys.version:
x = x.encode("utf-8")
for field in fields:
if field in x:
return False
return True
def main():
# 读取数据
gdp = pd.read_excel("GDP_MAP.xls")
# 筛选:去掉世界、一些地区性的数据
fields = ["世界", "收入国家", "地区", "南亚", "组织成员", "人口","北美", "联盟", "IBRD", "IDA", "重债穷国"]
gdp["is_country"] = gdp.apply(lambda x: is_country(x["Country Name"], fields), axis = 1)
gdp = gdp[gdp["is_country"] == True]
datas = []
for year in range(1960, 2019):
year = str(year)
gdp.sort_values(year, inplace = True, ascending = False)
print(year,"==========================================")
print(gdp[0:15][["Country Name", year]])
data = gdp[0:15]
data.sort_values(year, inplace = True, ascending = True)
data[year] = data[year] / 10 ** 11
datas.append([year, data[year].tolist(), data["Country Name"].tolist()])
plot = PlotUtil.Plot(datas)
if "v2" in sys.version: # 如果你是用python2运行
plot.showGif("gdp.gif", writer = "imagemagick")
if "v3" in sys.version: # r如果你是用python3运行
plot.showGif("gdp.html", writer = "html")
if __name__ == '__main__':
main()
2.准备PlotUtil.py
代码如下(示例):
#coding=utf-8
import matplotlib.pyplot as plt
from matplotlib import animation # 动图的核心函数
import sys
class Plot(object):
"""docstring for Plot"""
def __init__(self, data):
# 中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(figsize = (12,6))
self.fig = fig
self.ax = ax
self.data = data
def showGif(self, save_path, writer = 'imagemagick'):
plt.cla()
ani = animation.FuncAnimation(fig = self.fig,
func = self.update,
frames = len(self.data),
init_func = self.init,
interval = 0.5,
blit = False,
repeat = False)
# 不用imagemagick时,可以保存为html
ani.save(save_path, writer = writer, fps = 3) #
def init(self):
bar = self.ax.barh([], [], color = '#0CD9F1')
return bar
def update(self, i):
self.ax.cla()
data = self.data[i]
x = data[1]
y = data[2]
year = data[0]
bars = []
for k in range(len(x)):
tmp = y[k]
if "v2" in sys.version:
tmp = y[k].encode("utf-8")
if tmp in ["中国"]:
bar = self.ax.barh(k, x[k], color = 'r')
else:
bar = self.ax.barh(k, x[k], color = '#0CD9F1')
bars.append(bar)
#添加数据标签
for rect in bars:
rect = rect[0]
w = rect.get_width()
self.ax.text(w, rect.get_y() + rect.get_height() / 2, '%.1f' % float(w), ha = 'left',va = 'center')
#设置Y轴刻度线标签
self.ax.set_title(year)
self.ax.set_yticks(range(len(y)))
self.ax.set_yticklabels(y)
if "v2" in sys.version:
self.ax.set_xlabel("GDP(百亿)".decode("utf-8"))
else:
self.ax.set_xlabel("GDP(百亿)")
return bar
写的时候,你可以根据自己的喜好,修改代码的效果,以及相应的HEX,都是根据个人哈,如果需要多元化,还可以继续把根据每个国家的不用,利用flag进行颜色变换,效果会更好!这里我就不赘述了!
最后运行,打开html文件,即可达到你要的效果!
总结
效果展示
这是最后的效果,也希望大家多多支持!谢谢大家!
特别注意的是,请大家在运行的时候,放在同一个路径下。扫描二维码关注公众号,回复: 12687872 查看本文章![]()