【matplotlib 实战】--堆叠柱状图

堆叠柱状图 ,是一种用来分解整体、比较各部分的图。

与柱状图类似,堆叠柱状图常被用于比较不同类别的数值。而且,它的每一类数值内部,又被划分为多个子类别,这些子类别一般用不同的颜色来指代。

柱状图帮助我们观察"总量",堆叠柱状图则可以同时反映"总量"与"结构"。

也就是说,堆叠柱状图不仅可以反映总量是多少?还能反映出它是由哪些部分构成的?

进而,我们还可以探究哪一部分比例最大,以及每一部分的变动情况,等等。

1. 主要元素

堆叠柱状图是常用于比较多个类别或组之间的数据。

它通过将多个柱状图堆叠在一起,展示每个类别或组的总量以及各个部分的相对比例。

它的主要构成元素包括:

  1. 横轴:表示数据的主分类。
  2. 纵轴:每个子分类的比例关系。
  3. 堆叠的矩形:每个柱状图由多个堆叠部分组成,每个堆叠部分表示该类别或组中的一个部分或子类别。
  4. 图例:每个堆叠部分代表的意义。
图片来自 antv 官网

2. 适用的场景

堆叠柱状图适用于以下的分析场景:

  • 比较多个类别或组的总量以及各个部分的相对比例,例如不同产品的销售总额以及各个渠道的销售额占比。
  • 可视化多个类别或组的趋势变化,例如不同地区的人口数量随时间的变化趋势。
  • 对比多个类别或组之间的差异,例如不同年份的营业额对比。

3. 不适用的场景

堆叠柱状图不适用以下的分析场景:

  • 数据具有负值或包含缺失值的情况。堆叠柱状图只适用于展示正值数据,不适合包含负值或缺失值的数据。
  • 需要比较多个类别的绝对数值大小。堆叠柱状图主要关注各个部分的相对比例,而不是绝对数值大小的比较。

4. 分析实战

本次用堆叠柱状图统计最近几年全国居民消耗的主要几类粮食的情况。

4.1. 数据来源

数据来自国家统计局公开的人民生活 数据,可从下面的网址下载:
https://databook.top/nation/A0A

使用的是其中 A0A0A.csv文件(全国居民主要食品消费量)

python 复制代码
fp = "d:/share/A0A0A.csv"

df = pd.read_csv(fp)
df

4.2. 数据清理

本次绘制堆叠柱状图,时间上选择最近几年 的数据,由于2022年 的数据缺失,选择** 2013年~2021年的数据。
内容上每个年度选择
5类**常见的食物:

  1. 居民人均蔬菜及食用菌消费量(千克)
  2. 居民人均肉类消费量(千克)
  3. 居民人均禽类消费量(千克)
  4. 居民人均水产品消费量(千克)
  5. 居民人均蛋类消费量(千克)
python 复制代码
#> A0A0A03 居民人均蔬菜及食用菌消费量(千克)
#> A0A0A04 居民人均肉类消费量(千克)
#> A0A0A05 居民人均禽类消费量(千克)
#> A0A0A06 居民人均水产品消费量(千克)
#> A0A0A07 居民人均蛋类消费量(千克)
data = df[(df["sj"] >= 2013) & 
        (df["sj"] <= 2021) & 
        (df["zb"].isin(["A0A0A03", 
                        "A0A0A04",
                        "A0A0A05",
                        "A0A0A06",
                        "A0A0A07"]))].copy()

data.head(10)

一共45条数据,5个分类,每个分类有9个年度的数据。

4.3. 分析结果可视化

python 复制代码
data = data.sort_values("sj")
data[data["zb"] == "A0A0A03"]["value"].tolist()


with plt.style.context("seaborn-v0_8"):
    fig = plt.figure()
    ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])

    years = data["sjCN"].drop_duplicates(keep="first").tolist()
    bar_data = {
        "蔬菜及菌类(千克)": data[data["zb"] == "A0A0A03"]["value"].tolist(),
        "肉类(千克)": data[data["zb"] == "A0A0A04"]["value"].tolist(),
        "禽类(千克)": data[data["zb"] == "A0A0A05"]["value"].tolist(),
        "水产品(千克)": data[data["zb"] == "A0A0A06"]["value"].tolist(),
        "蛋类(千克)": data[data["zb"] == "A0A0A07"]["value"].tolist(),
    }

    bottom = np.zeros(len(years))
    for key, vals in bar_data.items():
        ax.bar(years, vals, label=key, bottom=bottom)
        bottom += vals

    ax.set_title("全国居民主要粮食消耗情况")
    ax.legend(loc="upper left", ncol=3)

看图中的分析结果,和事先预想的差不多,蔬菜肉类 是我们平时主要的粮食来源。

图中还可以看出,在3年疫情期间,粮食消耗逐步增多,可能是大家认为吃的好才能增强抵抗力 :)

相关推荐
HINOTOR_12 分钟前
DAY 29 复习日:类的装饰器
开发语言·python
Gyoku Mint37 分钟前
机器学习×第七卷:正则化与过拟合——她开始学会收敛,不再贴得太满
人工智能·python·算法·chatgpt·线性回归·ai编程
CodeCraft Studio1 小时前
图像处理控件Aspose.Imaging教程:用Java将 CMX 转换为 PNG
java·图像处理·python·aspose
惊鸿一博2 小时前
java_api路径_@Parameter与@RequestParam区别
java·python
漫谈网络2 小时前
pysnmp 操作流程和模块交互关系的可视化总结
python·pysnmp
钢铁男儿2 小时前
Python内置类型子类化的陷阱与解决方案
开发语言·前端·python
电院工程师2 小时前
ChipWhisperer教程(三)
笔记·python·嵌入式硬件·安全·fpga开发·安全架构
神州问学3 小时前
AutoGLM沉思版:智能体推理的Deep Research探索
人工智能·python
安全系统学习3 小时前
网络安全之框架安全漏洞分析
开发语言·python·计算机网络·web安全·网络安全
天天爱吃肉82183 小时前
【新能源汽车技术全景解析:构建智能出行新生态】
python·汽车