摘 要

在制作动态排序动画之前,我们看一下数据的整理情况:

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图表动画)相关推荐

  1. 1896-2021历届奥运会奖牌动态排序动画(Python数据采集)

    阅读本文大约需要 5 分钟 摘 要 通过前4篇数据分析文章的讲解,本周开始OF要为大家带来数据分析的实战.实战的选材呢,OF是随机选取的,如果大家有什么想要分析的难题,可以私信沟通. 本来想从网上直接 ...

  2. 1896-2021历届奥运会奖牌榜(Python数据处理)

    阅读本文大约需要 3 分钟 摘 要 这两天在平台上看到一些创作者失去创作动力的感慨,OF只想说往事如昙花一现,我们都需要时刻静下心来,认真地考虑下自己的创作目标并付诸行动.遥想当年OF做软件系统的时候 ...

  3. 今年的奥运会延期至2021年夏季举行,盘点一下历届奥运会数据

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于CDA数据分析师 ,作者:CDA数据分析师 前言 2020年年初,突然袭来的新冠疫情 ...

  4. python制作酷炫动画_厉害了!Python+matplotlib制作8个排序算法的动画

    1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是否与预期的一致,越做越有劲,越有劲越想去研究,公 ...

  5. 厉害了!Python+matplotlib制作8个排序算法的动画

    文章来源于Python与算法社区,作者zglg 1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是 ...

  6. anaconda matplotlib 输出动画_Python+Matplotlib 制作排序算法的动画

    1 .算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是否与预期的一致,越做越有劲,越有劲越想去研究, ...

  7. 可视化|历届奥运会数据可视化

    文章目录 1 数据来源 2 数据可视化 2.1 数量可视化 1. 男性运动员年龄分布直方图 2. 女性运动员年龄分布直方图 3. 全体运动员年龄分布直方图 4. 男性运动员身高体重分布散点图 5. 女 ...

  8. Python 爬取东京奥运会奖牌榜!中国原来这么厉害!

    需求分析 我们要爬取的是 2020东京奥运会奖牌榜. (截至 2021/8/2 下午 17:30) 右键单击网页,选择"检查",调出开发者界面.然后点击右侧选项卡中的"网 ...

  9. 数据爬虫及可视化——东京奥运会奖牌榜

    东京奥运会奖牌榜爬虫 通过手机浏览器实时查看奥运会奖牌信息 将手机浏览器访问的地址复制,通过计算机浏览器访问 打开谷歌浏览器的开发者工具,切换到network选项卡,刷新页面重新请求. 拖动滚动条,找 ...

最新文章

  1. java项目怎样提高性能_Java程序员成长之路(如何提高Java程序性能?)
  2. Junit 测试之 Spring Test
  3. 查看ip地址信息和配置临时ip
  4. Redis中的主从复制原理
  5. Linux加密框架 crypto RC4
  6. php设置表格边框颜色,HTML表格标记教程(38):表头的边框色属性BORDERCOLOR
  7. sklearn 线性回归
  8. windows与虚拟机中的Ubuntu共享文件夹
  9. End-to-End Object Detection with Transformers的部分解读
  10. SQL外键主键脚本查询
  11. 010 Editor for Mac(十六进制编辑器)v12.0
  12. matlab dbc文件,一种EXCEL转DBC文件的生成方法及装置与流程
  13. 理想费米气体的量子统计推导
  14. 基于python及图像识别的围棋棋盘棋子识别3——耗时优化(一行代码速度提高600倍)
  15. openlayers3加图标定位
  16. 红帽linux9 iso,RedHat Linux9.0 ISO 原版下载
  17. go mod invalid pseudo-version
  18. android蓝牙配对 自动联接,如何实现android蓝牙开发 自动配对连接,并不弹出提示框...
  19. SpringBoot官方开发工具,热部署和远程调试真带劲
  20. C#中File和FileInfo的区别和用法

热门文章

  1. 关于Android应用开发的一些安全注意事项
  2. 使用canvas 代码画小猪佩奇
  3. 把日期横杠转化为斜杠
  4. 深信服实习面经11_02
  5. WINUSB设备的inf文档的编写
  6. react二级路由配置正确不显示页面的问题解决
  7. 关于线宽与PCB过孔铺铜的一点经验
  8. tagged和untagged
  9. Python 画玫瑰花
  10. iPhone备忘录删了怎么恢复?恢复备忘录的两大方法!