用Python动态条形图展示巴黎奥运会金牌榜

用Python动态条形图展示巴黎奥运会金牌榜

巴黎奥运会已于2024年8月12日落下帷幕,中国队获得40金27银24铜,位列奖牌榜第2位。

奖牌榜的排序方式是首先按金牌数排序,如果金牌数相等,则在金牌数排序的基础上按银牌数排序,如果银牌数也相等,则继续按铜牌数排序。如果金银铜牌数量都相等,则根据国家名的字母排序。

中国的金牌数和美国一样,都是40枚,但因中国的银牌数更少,所以奖牌榜排在第2位。中国运动员在赛场上充分展示了运动风采和奥林匹克精神,都非常值得尊重。我们很优秀,别人也不差,第二名是一个非常好的成绩,值得国人骄傲。

其实,在奥运会进行期间,很多比赛日中国都位于榜首,中间有过反复交错变化,在倒数第二天,中国反超美国排在第一位,但最后一天又排到了第二。(这里只简单介绍奖牌榜的变化过程,而不分析赛程等因素。)

为了展示奖牌榜的变化过程,本文收集了每日奖牌榜数据,根据奖牌榜每天的变化,用Python动态条形图绘制了每日奖牌榜的变化情况。

动态条形图

动态条形图可以保存成动图或视频等,为了方便展示,我保存成了视频,结果如下。

巴黎奥运会金牌磅动态条形图

可以看到,在第一周,奖牌榜变化比较频繁,多个国家的排名都反复升降。从中程开始,中美两国就逐渐和其他国家拉开了差距,并一直保持到最后。

奥运结束,金牌数排名前十的是美国40金、中国40金、日本20金、澳大利亚18金、法国16金、荷兰15金、英国14金、韩国13金、意大利12金、德国12金。

代码实现介绍

1.绘图准备

Python绘制动态条形图有很多不同的方法,本文使用的是其中一个相对简单的库bar_chart_race。

bar_chart_race对matplotlib做了更上层的封装,使得绘图功能更简单,代码更简洁。bar_chart_race支持将动态条形图保存成.mp4,.gif,.html,.mpeg,.mov等各种格式。

使用bar_chart_race需要先做好一些准备工作,否则代码无法运行。

首先安装bar_chart_race:

bash 复制代码
pip install bar_chart_race

此外,如果要将动态条形图保存成.gif格式的动图,需要安装ImageMagick。如果要将动态条形图保存成.mp4格式的视频,需要安装ffmpeg。

这两个包的安装方法是到官网下载对应操作系统的release版本,到本地解压,然后配置环境变量。

ffmpeg官网:https://ffmpeg.org/download.html

ImageMagick官网:https://imagemagick.org/script/download.php

这里就不详细介绍步骤了,例如Windows系统可以搜索"windows安装ffmpeg"、"windows安装ImageMagick",网络上有很多安装步骤的介绍。

2.数据准备

准备好奥运奖牌榜的数据,保存到一个excel文件中,与代码放在同一目录下。

3.绘制动态条形图

做好准备工作后,执行如下代码即可生成动态条形图。

python 复制代码
# coding=utf-8
import pandas as pd
import matplotlib.pyplot as plt
import bar_chart_race as bcr


data = pd.read_excel('gold2024.xlsx')  # 读取表格数据
df = data.set_index('date').T.fillna(0)  # 数据预处理
plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
bcr.bar_chart_race(
    df,
    filename='file.mp4',  # 保存文件名
    n_bars=10,   # 条形图数量
    steps_per_period=30,  # 帧数
    period_length=1000,  # 帧率
    shared_fontdict={'weight': 'bold'},  # 字体加粗
    title_size=20,  # 标题大小
    bar_label_size=12,  # 标签大小
    tick_label_size=10,  # 坐标值大小
    figsize=(8, 4.5),  # 图形大小
    # 自定义颜色
    cmap=['#44B344', '#FF0000', '#495050', '#E27AA8', '#DC40F9', '#53A2E5', '#BF952E', '#6F44F6',
          '#8B3899', '#E97F5D', '#E27AA8', '#495050', '#53A2E5', '#BF952E', '#DC40F9', '#6F44F6'],
    title='2024巴黎奥运金牌磅',  # 标题
)

关于bar_chart_race的详细用法和细节,后续再专门介绍。


如果需要我整理的数据表格和代码,V联系我,我发给你。

相关阅读

用Python画一条祥龙,祝您新年龙腾万里

📢欢迎 点赞👍 收藏⭐ 评论📝 关注❤ 如有错误敬请指正!

☟ 学Python,点击下方名片关注我。☟

相关推荐
学测绘的小杨15 小时前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
zzzzzz3101 天前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐1 天前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱1 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot1 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海2 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱2 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽2 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码2 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理