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、根据年份,计算各国的奖牌合计数排名。
1)合并DataFrame:concat(),合并函数还有merge、join函数,有兴趣可以进入以下链接进行学习(https://blog.csdn.net/weixin_42782150/article/details/89546357)
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)列名修改
df.rename(columns={'国家':'国家/地区'},inplace=True)
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)
最终获得我们的完整数据
df.to_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.rename(columns={'国家':'国家/地区'},inplace=True)
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)
df.to_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 matplotlibplt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False #这两行需要手动设置
#防止动漫内存太大,报错
matplotlib.rcParams['animation.embed_limit'] = 2**128def 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 '#'+ colordf = 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['国家/地区'])):ax.text(value-dx,i,name,size=18,weight=600,ha ='right',va = 'bottom',color='#777777')ax.text(value+dx,i ,f'{value:,.0f}',size = 14,ha = 'left',va ='center')#ax.transAxes表示轴坐标系,(1,0.4)表示放置位置ax.text(1,0.4,current_year,transform = ax.transAxes,color ='#777777',size = 46,ha ='right',weight=800) ax.text(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)# 设置后面的网格ax.grid(which='major',axis='x',linestyle='-')#刻度线和网格线是在图标上方还是下方,True为下方ax.set_axisbelow(True)ax.text(0,1.15,'历届奥运会奖牌排行榜',transform=ax.transAxes,size=24,weight=600,ha='left',va='top')ax.text(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、数据采集-爬虫;
1896-2021历届奥运会奖牌动态排序动画(Python数据采集)
2、数据处理-数据清洗;
1896-2021历届奥运会奖牌榜(Python数据处理)
3、数据动态排序。(本篇文章)
因为奥运数据连续性较差,如果我们分析一些连续性强的数据,如各国人口数据,动态排序的效果会好很多。
1896-2021历届奥运会奖牌榜动态排序(Matplotlib图表动画)相关推荐
- 1896-2021历届奥运会奖牌动态排序动画(Python数据采集)
阅读本文大约需要 5 分钟 摘 要 通过前4篇数据分析文章的讲解,本周开始OF要为大家带来数据分析的实战.实战的选材呢,OF是随机选取的,如果大家有什么想要分析的难题,可以私信沟通. 本来想从网上直接 ...
- 1896-2021历届奥运会奖牌榜(Python数据处理)
阅读本文大约需要 3 分钟 摘 要 这两天在平台上看到一些创作者失去创作动力的感慨,OF只想说往事如昙花一现,我们都需要时刻静下心来,认真地考虑下自己的创作目标并付诸行动.遥想当年OF做软件系统的时候 ...
- 今年的奥运会延期至2021年夏季举行,盘点一下历届奥运会数据
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于CDA数据分析师 ,作者:CDA数据分析师 前言 2020年年初,突然袭来的新冠疫情 ...
- python制作酷炫动画_厉害了!Python+matplotlib制作8个排序算法的动画
1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是否与预期的一致,越做越有劲,越有劲越想去研究,公 ...
- 厉害了!Python+matplotlib制作8个排序算法的动画
文章来源于Python与算法社区,作者zglg 1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是 ...
- anaconda matplotlib 输出动画_Python+Matplotlib 制作排序算法的动画
1 .算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是否与预期的一致,越做越有劲,越有劲越想去研究, ...
- 可视化|历届奥运会数据可视化
文章目录 1 数据来源 2 数据可视化 2.1 数量可视化 1. 男性运动员年龄分布直方图 2. 女性运动员年龄分布直方图 3. 全体运动员年龄分布直方图 4. 男性运动员身高体重分布散点图 5. 女 ...
- Python 爬取东京奥运会奖牌榜!中国原来这么厉害!
需求分析 我们要爬取的是 2020东京奥运会奖牌榜. (截至 2021/8/2 下午 17:30) 右键单击网页,选择"检查",调出开发者界面.然后点击右侧选项卡中的"网 ...
- 数据爬虫及可视化——东京奥运会奖牌榜
东京奥运会奖牌榜爬虫 通过手机浏览器实时查看奥运会奖牌信息 将手机浏览器访问的地址复制,通过计算机浏览器访问 打开谷歌浏览器的开发者工具,切换到network选项卡,刷新页面重新请求. 拖动滚动条,找 ...
最新文章
- java项目怎样提高性能_Java程序员成长之路(如何提高Java程序性能?)
- Junit 测试之 Spring Test
- 查看ip地址信息和配置临时ip
- Redis中的主从复制原理
- Linux加密框架 crypto RC4
- php设置表格边框颜色,HTML表格标记教程(38):表头的边框色属性BORDERCOLOR
- sklearn 线性回归
- windows与虚拟机中的Ubuntu共享文件夹
- End-to-End Object Detection with Transformers的部分解读
- SQL外键主键脚本查询
- 010 Editor for Mac(十六进制编辑器)v12.0
- matlab dbc文件,一种EXCEL转DBC文件的生成方法及装置与流程
- 理想费米气体的量子统计推导
- 基于python及图像识别的围棋棋盘棋子识别3——耗时优化(一行代码速度提高600倍)
- openlayers3加图标定位
- 红帽linux9 iso,RedHat Linux9.0 ISO 原版下载
- go mod invalid pseudo-version
- android蓝牙配对 自动联接,如何实现android蓝牙开发 自动配对连接,并不弹出提示框...
- SpringBoot官方开发工具,热部署和远程调试真带劲
- C#中File和FileInfo的区别和用法