1896-2021历届奥运会奖牌榜动态排序(Matplotlib图表动画)

2023-11-10

摘 要

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

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 matplotlib

plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置
#防止动漫内存太大,报错
matplotlib.rcParams['animation.embed_limit'] = 2**128

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['国家/地区'])):
        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、数据动态排序。(本篇文章)

因为奥运数据连续性较差,如果我们分析一些连续性强的数据,如各国人口数据,动态排序的效果会好很多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1896-2021历届奥运会奖牌榜动态排序(Matplotlib图表动画) 的相关文章

  • 如果两点之间的距离低于某个阈值,则从列表中删除点

    我有一个点列表 只有当它们之间的距离大于某个阈值时 我才想保留列表中的点 因此 从第一个点开始 如果第一个点和第二个点之间的距离小于阈值 那么我将删除第二个点 然后计算第一个点和第三个点之间的距离 如果该距离小于阈值 则比较第一点和第四点
  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

    我正在尝试在 MQL5 中设置一个 PUB 套接字 并在 Python 中设置一个 SUB 套接字来接收消息 我在 MQL5 中有这个 include
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 在本地网络上运行 Bokeh 服务器

    我有一个简单的 Bokeh 应用程序 名为app py如下 contents of app py from bokeh client import push session from bokeh embed import server do
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo

随机推荐

  • 每日一题(C语言基础篇)3

    题目描述 求一个整数中2进制为1的个数 例如 8 00001000 有一个二进制为1的数 9999 270F 有8个2进制为1的数 代码实现 include
  • 树莓派4B串口配置

    树莓派环境 硬件 树莓派4B 系统 ubuntu22 04 串口信息 树莓派4B一共有6个串口 之前的版本只有2个串口 这6个串口中 有5个时硬件串口 还有个mini串口 这5个硬件串口在我们需要使用外设时 但是 默认情况下 5个默认串口只
  • Qt与VS的对比(1)

    对话框篇 QT与VS创建对话框的方式非常相似 都需要创建一个对话框类 在需要显示该对话框的地方包含对应的头文件 显示即可 区别 QT显示模态对话框使用函数QDialog exec VS显示模态对话框使用函数CDialog DoModal Q
  • JDK的下载与安装详细解释

    JDK的下载与安装 一 JDK下载 进入Oracle官网 https www oracle com index html 打开后我们通过选项卡找到Downloads 操作如下界面 接下来我们找到Deverloper Downloads中的J
  • Unity3D之简单的点击拾取

    新建一个Cube物体和一个脚本Cube 将Cube脚本挂到Cube物体上 代码如下 csharp view plain copy using UnityEngine using System Collections public class
  • Web Components 系列(八)—— 自定义组件的样式设置

    前言 通过前面的学习 对自定义组件的相关概念和知识点也有了一定了解 今天我们就来学习一下给自定义元素及其子元素设置样式的几种方法 直接给自定义标签添加样式 index html
  • 多module启动报错Could not resolve dependencies for project

    前几天用若依的前后端分离版本 项目能启动 打包发布时异常 提示找不到项目依赖 无法解析artifact Could not resolve dependencies for project The following artifacts c
  • [管理与领导-82]:IT基层管理者 - 核心技能 - 高效执行力 - 7- 高效执行的结果通过高效的过程保证

    目录 前言 一 执行前 对 1 1 确保做对事 do right thing 1 目标 行动的目标 2 方向 行动的方向 3 需求 行动是为了满足某种需求 4 指令 行到受谁的指令 1 2 确定做对事的方法 1 2 1 确认 do righ
  • 理解DOM事件流的三个阶段

    本文主要解决两个问题 什么是事件流 DOM事件流的三个阶段 起因 在学习前端的大半年来 对DOM事件了解甚少 一般也只是用用onclick来绑定个点击事件 在寒假深入学习JavaScript时 愈发觉得自己对DOM事件了解不够 遂打开我的
  • 全网最全的IDEA热部署方案,看完弄懂,再也不用加班

    概念 热部署就是正在运行状态的应用 修改了它的源码之后 在不重新启动的情况下能够自动把增量内容编译并部署到服务器上 使得修改立即生效 热部署为了解决的问题有两个 1 在开发的时候 修改代码后不需要重启应用就能看到效果 大大提升开发效率 2
  • python的http服务

    在一个局域网中因为要传输文件给朋友 所以建一个简单的http服务器 自己主机作为服务器 让朋友下载文件 自己主机安装pyhton 到要共享的文件夹下 开启HTTP服务 python m http server 9999 其他主机浏览器访问
  • Java实现算法“两数之和”

    最近开始刷LeetCode 为了加深印象 一定要写下来 题目 给定一个整数数组nums和一个目标值target 请你在该数组中找出和为目标值的那两个整数 并返回它们的数组下标 可以假设每种输入只会对应一个答案 但是不能重复利用这个数组中同样
  • Spring设计模式,事务管理和代理模式的应用

    扩充 贝叶斯定理答案见底 设计模式对关于面向对象问题的具体解决方案 1 单例多例 在设计单例模式时 要注意两个点 1 构造方法要私有 2 成员变量要私有 3 创建对象所用的方法要被synchronized修饰 因为方法体中会涉及到判断当前成
  • Java:利用I/O流读取文件内容

    要利用I O流读取文件内容 首先要掌握InputStream的体系结构 这个体系中FileInputStream和BufferedInputStream是一定要掌握的 因为使用的频率比较高 InputStream的方法 InputStrea
  • 爬虫简单语法

    一 requests 适用于爬取静态网页 1 get requests get 参数 参数可以是 接收一个网址 url 在请求某个查询时 在通用网址后 query 查询的内容 比如 在搜狗引擎中 搜索 content input 请输入你要
  • 1、基于ARM平台Golang简单Demo:交叉编译

    arm平台为M3352核心板 编译环境为Ubuntu14 04 目标 在Ubuntu环境编译Go代码 在arm平台运行 每分钟打印当前时间 源代码文件名 go arm cross build go package main import f
  • PyTorch入门(三)PyTorch常用操作

    PyTorch常用操作 bilinear kernel bilinear kernel def bilinear kernel in channels out channels kernel size return a bilinear k
  • STM32——SysTick timer(STK)----系统定时器

    系统定时器是属于Cortex内核中的一个外设 所有Cortex M内核的单片机都有这个定时器 Systick定时器常用来做延时 或者实时系统的心跳时钟 这样可以节省MCU资源 不用浪费一个定时器 它是一个24位 向下递减的计数器 由以下四个
  • elastic-job 执行原理

    Elastic Job执行原理 1 如果只有一个分片的情况下 就是和原生的quartz一样的 就是所有的任务都在一台机器上面执行 2 如果有两个分片的情况下 然后5个job在两台机器上面执行 机器 machine1 machine2 job
  • 1896-2021历届奥运会奖牌榜动态排序(Matplotlib图表动画)

    摘 要 在制作动态排序动画之前 我们看一下数据的整理情况 a 对第1 种大部分数据的情况 先爬取下来 输出到excel 1 b 对第2 种小部分数据的情况 也先爬取下来 输出到另一个excel 2 c 对第3 种个别的 还有第31 32届的