Advertisement

使用pandas-alive对“2022年冬奥运奖牌信息“可视化

阅读量:

简介

pandas-alive 以matplotlib绘图为后端,对pandasDataFrame对象进行绘图处理。虽然提供了很简单的绘制可视化图表机制,但是在使用的过程中,需要有特定的数据格式:

  • 数据的索引具有维度意义:例如时间, ** 当索引为整型时需考虑步长的关系,会影响数值
  • 每列包含特定类别的值

从上面的格式要求来看,用于生成可视化图表的最佳选择是:与时间有线性关系的数据集合。从文档里面给的数据源可以求证到这一点。

例子

在文档里面所列的数据都是经过了整理成合适的数据样例,数据与时间线性相关。

但是在实际生产中,很难找到能直接使用的例子。所以,在使用过程中,需要经历三个阶段:确定数据类型、数据处理、根据数据类型选择相应图表。

下面将使用从 和鲸社区 拿到的“2022年冬奥会奖牌信息” 进行例子演示:

确认数据类型

数据源为一个csv文件,以第一行作为表头,内容如下所示

观察数据,从整体上看,与时间相关性较强的是“国家”、“时间”、“奖牌类型”,所以我们可以得到一个较简单的模型: 同种奖牌类型下的国家获得奖牌数量时间的关系。

数据预处理

从上述的表中,数据格式不符合pandas-alive绘图的要求,于是得进行一系列的数据处理。

复制代码
    import pandas as pd
    import pandas_alive
    import numpy as np
    
    
    from examples.utils import get_filepath
    
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 替换sans-serif字体
    plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负数的负号显示问题
    
    
    filename = get_filepath("2022北京冬奥会奖牌榜明细.csv")
    df = pd.read_csv(filename)
    for name, group in df.groupby(["奖牌类型"]):
    g = group.drop(axis=1, labels=["国家英文", "获奖选手", "大项项目", "小项项目", "奖牌类型"])
    g = g.sort_values(by="获奖时间", ascending=True)
    columns = g["国家"].drop_duplicates().values
    index = g["获奖时间"].drop_duplicates().values
    memo = pd.DataFrame(np.zeros((len(index), len(columns))), index=index, columns=columns)
    for k, v in g.iterrows():
        memo[v["国家"]][v["获奖时间"]] = memo[v["国家"]].max() + 1
    memo = memo.replace(0, np.nan)
    memo = memo.fillna(method='pad')
    memo = memo.fillna(0)
    plot = memo.plot_animated(
        filename=f"{name}.gif", title=f"2022冬奥会 {name} 信息", period_fmt="")

在上述代码中,先按照“奖牌类型”进行分类,共三类(“金牌”、“银牌”、“铜牌”),而后根据每一个类别进行统计:

去除无关列,在这里的无关列是指对统计数据无关的数值

对数据按列获奖时间进行升序排列,得到表g

国家这一列进行去重处理生成一个列表,用于做新表的列

获奖时间这一列进行去重处理生成一个列表,用于做新表的行

生成一个填充数值为0的表,长 * 宽 = len(index) * len(columns), 制定索引和列名

遍历g的每一行,以内容更新表的数据,此时的表数据还有很大缺陷

下面三行分别是对memo进行数据更新,确保数值是连续、平滑且正确的。

选择图表

pandas-alive支持多种图表,使用kind参数进行选用,需要选择能够充分展示数据特征的图表。

按照数据之间的关系,我们可以把可视化视图划分为 4 类,它们分别是比较、联系、构成和分布。

这四种关系的特点:

  • 比较:比较数据间各类别的关系,或者是它们随着时间的变化趋势,比如折线图、条形图;
  • 联系:查看两个或两个以上变量之间的关系,比如散点图;
  • 构成:每个部分占整体的百分比,或者是随着时间的百分比变化,比如饼图;
  • 分布:关注单个变量,或者多个变量的分布情况,比如直方图。

由于在上述的例子中,我们需要展示各个国家获奖情况对在时间上的比较,所以可以考虑使用 条形图 进行创作图表:
在这里插入图片描述

再引一个例子:如果是想要对比一个国家内获得奖牌种类比例和时间的关系,使用饼图。
在这里插入图片描述

最后

个人认为pandas-alive的使用关键是考虑对数据模型和数据的清理过程,此外,使用这个库的多个图表是画直线、点的形式,所以在曲线的实现上有些难度。

全部评论 (0)

还没有任何评论哟~