IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 1896-2021历届奥运会奖牌榜动态排序(Matplotlib图表动画) -> 正文阅读

[游戏开发]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 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、数据动态排序。(本篇文章)

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

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章           查看所有文章
加:2021-09-08 11:04:24  更:2021-09-08 11:06:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 15:57:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码