堆叠柱状图,是一种用来分解整体、比较各部分的图。
与柱状图类似,堆叠柱状图常被用于比较不同类别的数值。而且,它的每一类数值内部,又被划分为多个子类别,这些子类别一般用不同的颜色来指代。
柱状图帮助我们观察“总量”,堆叠柱状图则可以同时反映“总量”与“结构”。
也就是说,堆叠柱状图不仅可以反映总量是多少?还能反映出它是由哪些部分构成的?
进而,我们还可以探究哪一部分比例最大,以及每一部分的变动情况,等等。
堆叠柱状图是常用于比较多个类别或组之间的数据。
它通过将多个柱状图堆叠在一起,展示每个类别或组的总量以及各个部分的相对比例。
它的主要构成元素包括:
堆叠柱状图适用于以下的分析场景:
堆叠柱状图不适用以下的分析场景:
本次用堆叠柱状图统计最近几年全国居民消耗的主要几类粮食的情况。
数据来自国家统计局公开的人民生活数据,可从下面的网址下载:
https://databook.top/nation/A0A
使用的是其中 A0A0A.csv
文件(全国居民主要食品消费量)
fp = "d:/share/A0A0A.csv"
df = pd.read_csv(fp)
df
本次绘制堆叠柱状图,时间上选择最近几年的数据,由于2022年的数据缺失,选择** 2013年~2021年的数据。
内容上每个年度选择5类**常见的食物:
#> 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
个年度的数据。
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年疫情期间,粮食消耗逐步增多,可能是大家认为吃的好才能增强抵抗力 :)