1896-2021历届奥运会奖牌榜动态排序(Matplotlib图表动画)
空调外机不转内机有风吹不制冷
摘要
在制作动态排序动画之前,我们看⼀下数据的整理情况:
a、对第1)种⼤部分数据的情况,先爬取下来,输出到excel(1);
b、对第2)种⼩部分数据的情况,也先爬取下来,输出到另⼀个excel(2);
c、对第3)种个别的,还有第31-32届的数据,算了,别折腾了,⼿动复制粘贴到excel(3)吧。
d、最后把这3个excel合并到⼀个excel,进⾏数据处理吧。
⼆、数据处理
周公解梦梦见头发
经过1896-2021历届奥运会奖牌榜动态排序系列的数据处理(第⼆篇),我们得到了a数据:
看到这张数据表,还有以下⼏点需要调整:
1、合并3个excel数据;
2、标题、年份列顺序调整到名次前;
3、'国家'列名修改为'国家/地区';
4、计算奖牌的合计数量;
5、根据年份,计算各国的奖牌合计数排名。
df1 = pd.read_excel("./data/Olympic10.xlsx")
df2 = pd.read_excel("./data/Olympic11.xlsx")
df3 = pd.read_excel("./data/Olympic12.xlsx")
df = pd.concat([df1,df2,df3],axis=0,ignore_index=True,sort=True)
2)调账列顺序
columns = ['标题','年份','国家','⾦牌','银牌','铜牌'] df = pd.DataFrame(df, columns=columns) 3)列名修改
4)计算奖牌合计
df['合计'] = '' df['合计'] = df['⾦牌'] + df['银牌'] + df['铜牌']
5)按年份,计算各国的奖牌合计数排名
df['排名'] = df.groupby('年份',axis=0)['合计'].rank(method='first',ascending=False)
另外,再对数据进⾏⼀些微调
df=df.drop_duplicates(subset=['年份', '国家/地区'], keep='first')
df.sort_values(["年份","排名"],inplace=True,ascending=True)
#将国家/地区列字符串中的空格都去除
df['国家/地区'].replace('\s+','',regex=True,inplace=True)
最终获得我们的完整数据
<_excel("./data/Olympic_final.xlsx")
完整代码如下:
import pandas as pd
df1 = pd.read_excel("./data/Olympic10.xlsx")
df2 = pd.read_excel("./data/Olympic11.xlsx")
df3 = pd.read_excel("./data/Olympic12.xlsx")
df = pd.concat([df1,df2,df3],axis=0,ignore_index=True,sort=True)
columns = ['标题','年份','国家','⾦牌','银牌','铜牌']
df = pd.DataFrame(df, columns=columns)
df['合计'] = ''
df['合计'] = df['⾦牌'] + df['银牌'] + df['铜牌']
df.loc[df['年份']==1894,'年份'] = 1900
df=df.drop_duplicates(subset=['年份', '国家/地区'], keep='first')
df['排名'] = df.groupby('年份',axis=0)['合计'].rank(method='first',ascending=False) df.sort_values(["年份","排名"],inplace=True,ascending=True)
#将国家/地区列字符串中的空格都去除
df['国家/地区'].replace('\s+','',regex=True,inplace=True)
<_excel("./data/Olympic_final.xlsx")
输出结果:
三、动态排序
经过⼀系列的数据处理,终于可以验证下劳动成果了。完整代码如下:
import pandas as pd
import random
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.animation as animation
from IPython.display import HTML
import matplotlib
#防⽌动漫内存太⼤,报错
def randomcolor():
colorlist = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
color =''
for i in range(6):
color += random.choice(colorlist)
return '#'+ color
df = pd.read_excel(r"D:\Mechtouch\Pyproject\Data_analyse\data\Olympic_final.xlsx") #对地区列表进⾏去重,分类;
area_list1 = set(df['国家/地区'])
# color_list⽤于存放随机⽣成颜⾊代码个数
# 因为后⾯区域个数要与颜⾊个数保持⼀致,这⾥⽤了len函数;
color_list =[]
for i in range(len(area_list1)):
str_1 = randomcolor()
color_list.append(str_1)
str_1 = randomcolor()
#area_list转化为列表
area_list_1 = [i for i in area_list1]
#colors表⽰所在城市:颜⾊⼀⼀对应字典形式;
colors =dict(zip(area_list_1,color_list))
# ⽤plt加理图表,figsize表⽰图标长宽,ax表⽰标签
fig, ax = plt.subplots(figsize=(15, 8))
#dras_barchart⽣成current_year这⼀年各城市⼈⼝基本情况;
def draw_barchart(current_year):
#dff对year==current_year的⾏,以”合计“降序排序,取前⼗名;
dff = df[df['年份'].eq(current_year)].sort_values(by='合计',ascending = True).tail(10)
环境工程专业就业
# 所有坐标、标签清除
ax.clear()
#显⽰颜⾊、城市名字
ax.barh(dff['国家/地区'],dff['合计'],color = [colors[x] for x in dff['国家/地区']])
dx = dff['合计'].max()/200
#ax.text(x,y,name,font,va,ha)
# x,y表⽰位置;
# name表⽰显⽰⽂本;
# va,ba分别表⽰⽔平位置,垂直放置位置;
for i ,(value,name) in enumerate(zip(dff['合计'], dff['国家/地区'])):
<(value-dx,i,name,size=18,weight=600,ha ='right',va = 'bottom',color='#777777')
<(value+dx,i ,f'{value:,.0f}',size = 14,ha = 'left',va ='center')
#ax.transAxes表⽰轴坐标系,(1,0.4)表⽰放置位置
<(1,0.4,current_year,transform = ax.transAxes,color ='#777777',size = 46,ha ='right',weight=800)
<(0,1.06,'Olympic Medals',transform = ax.transAxes,size=12,color='#777777')
#set_major_formatter表⽰刻度尺格式;
ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}'))
ax.xaxis.set_ticks_position('top')
ax.tick_params(axis='x',colors='#777777',labelsize=12)
ax.set_yticks([])
#margins表⽰⾃动缩放余额;
ax.margins(0,0.01)
# 设置后⾯的⽹格
#刻度线和⽹格线是在图标上⽅还是下⽅,True为下⽅
ax.set_axisbelow(True)
<(0,1.15,'历届奥运会奖牌排⾏榜',
ansAxes,size=24,weight=600,ha='left',va='top')
<(1,0,'Officetouch制作',transform = ax.transAxes, size=16,color ='#777777',ha = 'right',
bbox = dict(facecolor='white',alpha = 0.8,edgecolor='white'))
#取消图表周围的⽅框显⽰
plt.box(False)
#将原来的静态图拼接成动画
司藤的孩子是谁
fig, ax = plt.subplots(figsize=(15, 8))无线网密码破解
animator = animation.FuncAnimation(fig, draw_barchart, frames=df['年份'].drop_duplicates(),interval = 1000) animator.save("./data/Olympic.gif")
输出结果:
研究发现喝无糖碳酸饮料更易发胖结语
学习需要耐⼼和时间的投⼊,初学的时候可能需要投⼊⽐较多的时间和精⼒,但只要有这样⼀个过程,你就会脱胎换⾻,⼀点⼀滴的积累成就⾃⼰。
1、数据采集-爬⾍;
2、数据处理-数据清洗;
3、数据动态排序。(本篇⽂章)
因为奥运数据连续性较差,如果我们分析⼀些连续性强的数据,如各国⼈⼝数据,动态排序的效果会好很多。