【matplotlib 实战】--百分比柱状图

matplotlib,实战,百分比,柱状图 · 浏览次数 : 41

小编点评

**主要元素百分比柱状图** * 是一个用于可视化比较不同类别或组的百分比或比例的图表。 * 主要元素包括横轴:表示数据的主分类。 * 纵轴:每个子分类的比例关系。 * 堆叠的矩形:每个柱状图由多个堆叠部分组成,和堆叠柱状图不同的是,每个柱子都是一样高的。 * 图例:每个堆叠部分代表的意义。 **适用的场景** * 市场份额:比较不同产品或服务的市场份额,帮助决策者了解市场竞争情况。 * 人口比例:显示不同地区或不同群体的人口比例,或不同年龄段的人口比例。 * 问卷调查结果:比较不同选项或答案的频率或比例,或者用户对产品特性的满意度。 * 部门预算分配:显示不同部门或项目的预算分配比例,帮助管理者了解资源分配情况。 **不适用的场景** * 比较绝对数值:如果需要比较具体的数值大小而不仅仅是比例,那么百分比柱状图可能不是最合适的选择。 * 数据存在重叠:如果不同类别的数据存在重叠或者相互依赖的情况,百分比柱状图可能无法清晰地展示比例关系。 * 数据量过大或过小:如果数据量过大或过小,百分比柱状图可能无法有效地显示比例关系。 **分析实战和上一篇堆叠柱状图使用相同的原始数据,绘制图形之后可以看看这两种柱状图展示分析结果的区别** 1. **数据来源**:数据来自国家统计局公开的人民生活数据,可从下面的网址下载: ``` https://databook.top/nation/A0A使用的是其中 A0A0A.csv文件(全国居民主要食品消费量)fp = "d:/share/A0A0A.csv"df = pd.read_csv(fp)df4.2. ``` 2. **数据清理**选取和上一篇堆叠柱状图一样,还是5类:居民人均蔬菜及食用菌消费量(千克)居民人均肉类消费量(千克)居民人均禽类消费量(千克)居民人均水产品消费量(千克)居民人均蛋类消费量(千克) 3. **分析结果**可视化 ```python import matplotlib.ticker as mticker data.sort_values("sj", inplace=True) data["各类消耗量占比"] = data["各类消耗量占比"] * 100 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"][ "各类消耗量占比"]].tolist(), "肉类(%)": data[data["zb"] == "A0A0A04"]["各类消耗量占比"]].tolist(), "禽类(%)": data[data["zb"] == "A0A0A05"]["各类消耗量占比"]].tolist(), "水产品(%)": data[data["zb"] == "A0A0A06"]["各类消耗量占比"]].tolist(), "蛋类(%)": data[data["zb"] == "A0A0A07"]["各类消耗量占比"]].tolist(), } bottom = np.zeros(len(years)) for key, vals in bar_data.items(): ax.bar(years, vals, label=key, bottom=bottom) bottom += vals # 设置Y轴刻度的显示格式 ax.set_ylim(0, 110) yticks = ax.get_yticks().tolist() ax.yaxis.set_major_locator(mticker.FixedLocator(yticks)) ax.set_yticklabels(["\{}%".format(x) for x in yticks]) ax.set_title("全国居民主要粮食消耗情况") ax.legend(loc="upper left", ncol=5) ```

正文

百分比堆叠式柱状图是一种特殊的柱状图,它的每根柱子是等长的,总额为100%。
柱子内部被分割为多个部分,高度由该部分占总体的百分比决定。

百分比堆叠式柱状图不显示数据的“绝对数值”,而是显示“相对比例”。
但同时,它也仍然具有柱状图的固有功能,即“比较”——我们可以通过比较多个柱子的构成,分析数值之间的相对差异,或者得出数值变化的趋势。

1. 主要元素

百分比柱状图是一种用于可视化比较不同类别或组的百分比或比例的图表。

它的主要元素包括:

  1. 横轴:表示数据的主分类。
  2. 纵轴:每个子分类的比例关系。
  3. 堆叠的矩形:每个柱状图由多个堆叠部分组成,和堆叠柱状图不同的是,每个柱子都是一样高的。
  4. 图例:每个堆叠部分代表的意义。

图片来自 antv 官网

2. 适用的场景

百分比柱状图适用的场景很多,比如:

  • 市场份额:比较不同产品或服务的市场份额,帮助决策者了解市场竞争情况。
  • 人口比例:显示不同地区或不同群体的人口比例,或不同年龄段的人口比例。
  • 问卷调查结果:比较不同选项或答案的频率或比例,或者用户对产品特性的满意度。
  • 部门预算分配:显示不同部门或项目的预算分配比例,帮助管理者了解资源分配情况。
  • 等等。。。

3. 不适用的场景

百分比柱状图也有不适用于的场景,比如:

  • 比较绝对数值:如果需要比较具体的数值大小而不仅仅是比例,那么百分比柱状图可能不是最合适的选择。
  • 数据存在重叠:如果不同类别的数据存在重叠或者相互依赖的情况,百分比柱状图可能无法清晰地展示比例关系。
  • 数据量过大或过小:如果数据量过大或过小,百分比柱状图可能无法有效地显示比例关系。

4. 分析实战

和上一篇堆叠柱状图使用相同的原始数据,绘制图形之后可以看看这两种柱状图展示分析结果的区别。

4.1. 数据来源

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

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

fp = "d:/share/A0A0A.csv"

df = pd.read_csv(fp)
df

image.png

4.2. 数据清理

选取和上一篇堆叠柱状图一样,还是5类:

  1. 居民人均蔬菜及食用菌消费量(千克)
  2. 居民人均肉类消费量(千克)
  3. 居民人均禽类消费量(千克)
  4. 居民人均水产品消费量(千克)
  5. 居民人均蛋类消费量(千克)

和堆叠柱状图不同的是,绘制百分比柱状图用的是百分比数值,
所有要把原始数据中每年的绝对数值转换为百分比数值。

data = df[(df["sj"] >= 2013) & 
        (df["sj"] <= 2021) & 
        (df["zb"].isin(["A0A0A03", 
                        "A0A0A04",
                        "A0A0A05",
                        "A0A0A06",
                        "A0A0A07"]))].copy()

data["年消耗总量"] = data.groupby("sj").value.transform("sum")
data["各类消耗量占比"] = data["value"] / data["年消耗总量"]

data.loc[:, ["sjCN", "zbCN", "各类消耗量占比"]].head(10)

image.png

4.3. 分析结果可视化

import matplotlib.ticker as mticker

data = data.sort_values("sj")
data["各类消耗量占比"] = data["各类消耗量占比"]*100

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"]["各类消耗量占比"].tolist(),
        "肉类(%)": data[data["zb"] == "A0A0A04"]["各类消耗量占比"].tolist(),
        "禽类(%)": data[data["zb"] == "A0A0A05"]["各类消耗量占比"].tolist(),
        "水产品(%)": data[data["zb"] == "A0A0A06"]["各类消耗量占比"].tolist(),
        "蛋类(%)": data[data["zb"] == "A0A0A07"]["各类消耗量占比"].tolist(),
    }

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

    # 设置Y轴刻度的显示格式
    ax.set_ylim(0, 110)
    yticks = ax.get_yticks().tolist()
    ax.yaxis.set_major_locator(mticker.FixedLocator(yticks))
    ax.set_yticklabels(["{}%".format(x) for x in yticks])

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

image.png

百分比柱状图每年的数据高度都一样,与堆叠柱状图相比,更容易比较每个种类粮食的消耗情况。
不过,这种图看不出粮食总量的变化情况了。

与【matplotlib 实战】--百分比柱状图相似的内容:

【matplotlib 实战】--百分比柱状图

百分比堆叠式柱状图是一种特殊的柱状图,它的每根柱子是等长的,总额为100%。柱子内部被分割为多个部分,高度由该部分占总体的百分比决定。 百分比堆叠式柱状图不显示数据的“绝对数值”,而是显示“相对比例”。但同时,它也仍然具有柱状图的固有功能,即“比较”——我们可以通过比较多个柱子的构成,分析数值之间的

【matplotlib 实战】--饼图

饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表。在饼图中,每个扇形的弧长(以及圆心角和面积)大小,表示该种类占总体的比例,且这些扇形合在一起刚好是一个完全的圆形。 饼图最显著的功能在于表现“占比”。习惯上,人们通过比较饼图扇形的大小来获得对数据的认知。 使用饼图时,须确认各个扇形的数据加起来等

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

堆叠柱状图,是一种用来分解整体、比较各部分的图。与柱状图类似,堆叠柱状图常被用于比较不同类别的数值。而且,它的每一类数值内部,又被划分为多个子类别,这些子类别一般用不同的颜色来指代。 柱状图帮助我们观察“总量”,堆叠柱状图则可以同时反映“总量”与“结构”。也就是说,堆叠柱状图不仅可以反映总量是多少?

【matplotlib 实战】--直方图

直方图,又称质量分布图,用于表示数据的分布情况,是一种常见的统计图表。 一般用横轴表示数据区间,纵轴表示分布情况,柱子越高,则落在该区间的数量越大。构建直方图时,首先首先就是对数据划分区间,通俗的说即是划定有几根柱子(比如,1980年~2020年的数据,每5年划分一个区间的话,共8个区间)。接着,对

【matplotlib 实战】--柱状图

柱状图,是一种使用矩形条,对不同类别进行数值比较的统计图表。在柱状图上,分类变量的每个实体都被表示为一个矩形(通俗讲即为“柱子”),而数值则决定了柱子的高度。 1. 主要元素 柱状图是一种用长方形柱子表示数据的图表。它包含三个主要元素: 横轴(x轴):表示数据的类别或时间。 纵轴(y轴):表示数据的

【matplotlib 实战】--平行坐标系

平行坐标系是一种统计图表,它包含多个垂直平行的坐标轴,每个轴表示一个字段,并用刻度标明范围。通过在每个轴上找到数据点的落点,并将它们连接起来形成折线,可以很容易地展示多维数据。随着数据增多,折线会堆叠,分析者可以从中发现数据的特性和规律,比如发现数据之间的聚类关系。 尽管平行坐标系与折线图表面上看起

【matplotlib 实战】--堆叠面积图

堆叠面积图和面积图都是用于展示数据随时间变化趋势的统计图表,但它们的特点有所不同。面积图的特点在于它能够直观地展示数量之间的关系,而且不需要标注数据点,可以轻松地观察数据的变化趋势。而堆叠面积图则更适合展示多个数据系列之间的变化趋势,它们一层层的堆叠起来,每个数据系列的起始点是上一个数据系列的结束点

【matplotlib 实战】--面积图

面积图,或称区域图,是一种随有序变量的变化,反映数值变化的统计图表。 面积图也可用于多个系列数据的比较。这时,面积图的外观看上去类似层叠的山脉,在错落有致的外形下表达数据的总量和趋势。面积图不仅可以清晰地反映出数据的趋势变化,也能够强调不同类别的数据间的差距对比。 面积图的特点在于,折线与自变量坐标

【matplotlib 实战】--折线图

折线图是一种用于可视化数据变化趋势的图表,它可以用于表示任何数值随着时间或类别的变化。 折线图由折线段和折线交点组成,折线段表示数值随时间或类别的变化趋势,折线交点表示数据的转折点。 折线图的方向表示数据的变化方向,即正变化还是负变化,折线的斜率表示数据的变化程度。 1. 主要元素 折线图主要由以下

Python从零到壹丨带你了解图像直方图理论知识和绘制实现

摘要:本文将从OpenCV和Matplotlib两个方面介绍如何绘制直方图,这将为图像处理像素对比提供有效支撑。 本文分享自华为云社区《[Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现》,作者:eastmount。 一.图像直方图理论知识 灰度直方图是灰度级的函数,描述