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

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

1. 主要元素

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

它的主要元素包括:

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

2. 适用的场景

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

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

3. 不适用的场景

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

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

4. 分析实战

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

4.1. 数据来源

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

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

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

df = pd.read_csv(fp)
df

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)

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)

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

【matplotlib 实战】--百分比柱状图的更多相关文章

  1. matplotlib实现三维柱状图

    matplotlib实现三维柱状图 import cv2 img = cv2.imread("1.png", 0) #特征点在图片中的坐标位置 m = 448 n = 392 im ...

  2. 机器学习-Matplotlib绘图(柱状图,曲线图,点图)

    matplotlib 作为机器学习三大剑客之一   ,比热按时无比强大的 matplotlib是绘图库,所以呢我就分享一下简单的绘图方式 #柱状图 #导报 柱状图 import matplotlib. ...

  3. 使用matplotlib 制图(柱状图、箱型图)

    柱状图: import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv('D:\\myfiles\\study\\pyt ...

  4. (转)matplotlib实战

    原文:https://www.cnblogs.com/ws0751/p/8361330.html https://www.cnblogs.com/ws0751/p/8313017.html---mat ...

  5. matplotlib实战

    plt.imshow(face_image.mean(axis=2),cmap='gray') 图片灰度处理¶   size = (m,n,3) 图片的一般形式就是这样的 rgb 0-255 jpg图 ...

  6. python学习之matplotlib实战2

    import numpy as np import matplotlib.pyplot as plt def main(): #scatter fig = plt.figure() ax = fig. ...

  7. python学习之matplotlib实战

    import numpy as np def main(): # print("hello") # line import matplotlib.pyplot as plt x = ...

  8. matplotlib 中的柱状图

    def drawBar(): pyplot.bar(range(5),[100,200,300,400,400]) pyplot.xticks(range(5),['A','B','C','D','E ...

  9. matplotlib 柱状图 Bar Chart 样例及参数

    def bar_chart_generator():     l = [1,2,3,4,5]     h = [20, 14, 38, 27, 9]     w = [0.1, 0.2, 0.3, 0 ...

  10. Python调用matplotlib实现交互式数据可视化图表案例

    交互式的数据可视化图表是 New IT 新技术的一个应用方向,在过去,用户要在网页上查看数据,基本的实现方式就是在页面上显示一个表格出来,的而且确,用表格的方式来展示数据,显示的数据量会比较大,但是, ...

随机推荐

  1. vulnhub-xxe靶场通关(xxe漏洞续)

    vulnhub-xxe靶场通关(xxe漏洞续) 下面简单介绍一个关于xxe漏洞的一个靶场,靶场来源:https://www.vulnhub.com 这里面有很多的靶场. 靶场环境需要自己下载:http ...

  2. PostgreSQL 12 文档: SQL 语法

    SQL 命令   这部分包含PostgreSQL支持的SQL命令的参考信息.每条命令的标准符合和兼容的信息可以在相关的参考页中找到. 目录 ABORT - 中止当前事务 ALTER AGGREGATE ...

  3. PowerBuilder从入坑到放弃(二)编码规范

    前言 上一篇我们从0到1用pb开发了一个helloworld程序,并成功将开发的程序编译打包并且制作了安装包. 程序员最讨厌的莫过于写文档和别人不写注释. 不知道大家会不会和我一样,在找bug时,有段 ...

  4. Lakehouse: A New Generation of Open Platforms that Unify Data Warehousing and Advanced Analytics

    在Delta Lake官网上提到的一篇新一代湖仓架构的论文. 这篇论文由Databricks团队2021年发表于CIDR会议. 这个会议是对sigmod和vldb会议的补充. 可以看到这篇论文和前一篇 ...

  5. linux内核编译体验篇(一)

    文章目录 一. 准备环境 二. 获取内核源码 三. 交叉编译工具链的配置 1. 博友们常用安装方法链接 2. 公司常用的交叉工具链使用方法 四. 内核解压以及如何打补丁 五. 内核基本配置 1. 编译 ...

  6. docker :repository docker.io/zookeeper not found: does not exist or no pull access

    分析 略 解决 vi /etc/docker/daemon.json { "registry-mirrors" : [ "http://registry.docker-c ...

  7. html表格基本标签

    1.<table>表签 <table>...</table>标签用于在html文档中后创建表格.它包含表名和表格本身内容的代码. 2.<tr>标签 &l ...

  8. QLabel类中的常用方法&信号

    setAlignment: 按固定值方式对齐文本 Qt.AlignLeft:水平方向靠左对齐 Qt.AlignRight:水平方向靠右对齐 Qt.AlignCenter:水平方向居中对齐 Qt.Ali ...

  9. centos7安装weblogic

    前言 简介:weblogic是java应用服务器软件的一种,类似于tomcat,但功能更多,适用于大型应用场景. 版本: 系统:centos 7(最小化安装,无图形化界面) jdk: oraclejd ...

  10. PHP秒杀面试题

    什么是秒杀系统:秒杀系统是一个处理大量并发用户请求的系统,通常用于限时促销或特定活动中,用户可以在特定时间内以抢购的方式购买商品或服务. 秒杀系统可能面临的挑战是什么?秒杀系统可能面临以下挑战: 高并 ...