目录

      • Matplotlib 可视化大师系列博客总览
  • Matplotlib 可视化大师系列(三):plt.bar() 与 plt.barh() - 清晰对比的柱状图
    • 一、 柱状图是什么?何时使用?
    • 二、 函数原型与核心参数
      • `plt.bar(x, height, ...)` - 垂直柱状图
      • `plt.barh(y, width, ...)` - 水平柱状图
    • 三、 从入门到精通:代码示例
      • 示例 1:基础垂直柱状图
      • 示例 2:分组柱状图
      • 示例 3:堆叠柱状图与水平柱状图
    • 四、 最佳实践与常见陷阱
    • 五、 总结


Matplotlib 可视化大师系列博客总览

本系列旨在提供一份系统、全面、深入的 Matplotlib 学习指南。以下是博客列表:

  1. 基础篇plt.plot() - 绘制折线图的利刃
  2. 分布篇plt.scatter() - 探索变量关系的散点图
  3. 比较篇plt.bar()plt.barh() - 清晰对比的柱状图
  4. 统计篇plt.hist()plt.boxplot() - 洞察数据分布
  5. 占比篇plt.pie() - 展示组成部分的饼图
  6. 高级篇plt.imshow() - 绘制矩阵与图像的强大工具
  7. 专属篇: 绘制误差线 (plt.errorbar())、等高线 (plt.contour()) 等特殊图表
  8. 综合篇: 在一张图中组合多种图表类型

Matplotlib 可视化大师系列(三):plt.bar() 与 plt.barh() - 清晰对比的柱状图

柱状图是数据可视化中最常用、最有效的图表类型之一,专门用于比较不同类别的数值。Matplotlib 提供了 plt.bar()(垂直柱状图)和 plt.barh()(水平柱状图)两个函数来创建这种图表。本文将深入解析这两个函数,帮助你掌握创建清晰、准确对比图表的艺术。

一、 柱状图是什么?何时使用?

柱状图使用高度(或长度)不同的矩形(柱体)来表示不同类别的数值大小。每个柱体代表一个类别,柱体的高度代表该类别的数值。

适用场景:

  • 比较不同类别的数量(如不同产品的销量)
  • 显示数据随时间的变化(时间序列数据,但通常用于离散时间点)
  • 对比分组数据

与直方图的区别(重要!):

  • 柱状图 (Bar Chart):比较不同类别的数值。X轴是分类变量(如城市名、产品类型)。
  • 直方图 (Histogram):显示单个变量的分布情况。X轴是连续数值被分成的区间(bins)。

二、 函数原型与核心参数

plt.bar(x, height, ...) - 垂直柱状图

plt.bar(x, height, width=0.8, bottom=None, *, align='center', **kwargs)

plt.barh(y, width, ...) - 水平柱状图

plt.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)

核心参数详解:

  1. 定位参数:
    • x / y: 柱体中心的坐标。对于分类数据,通常是类别标签的索引(如 [0, 1, 2, 3])或直接是标签(需要配合 plt.xticks())。
    • height / width: 柱体的高度(垂直)或宽度(水平),即要比较的数值。
  2. 尺寸参数:
    • width: (垂直) 柱体的宽度,默认0.8。通常保持在0.8以下,柱体间会有清晰间隔。
    • height: (水平) 柱体的高度,默认0.8。
    • bottom / left: 柱体的底部(垂直)或左侧(水平)基准线。这是创建堆叠柱状图的关键!
  3. 对齐方式:
    • align: 柱体与X坐标的对齐方式。'center'(默认,中心对齐)或 'edge'(边缘对齐)。
  4. 样式参数 (**kwargs):
    • color / facecolor / fc: 柱体填充颜色。可以是一个颜色(所有柱体相同),也可以是一个颜色列表(每个柱体不同)。
    • edgecolor / ec: 柱体边缘颜色。
    • linewidth / lw: 柱体边缘线宽。
    • alpha: 透明度。
    • label: 用于图例的标签(为一组柱体设置标签)。
    • tick_label: 直接指定每个柱体的刻度标签,替代默认的x坐标。

三、 从入门到精通:代码示例

示例 1:基础垂直柱状图

import matplotlib.pyplot as plt
import numpy as np# 数据
categories = ['Apples', 'Oranges', 'Bananas', 'Grapes']
values = [15, 12, 18, 9]# 创建图形
fig, ax = plt.subplots(figsize=(8, 5))# 绘制柱状图
bars = ax.bar(categories, values)# 美化
ax.set_title('Fruit Sales Comparison')
ax.set_ylabel('Quantity Sold')
ax.grid(axis='y', linestyle='--', alpha=0.7) # 只在y轴加网格线# 在柱体顶端添加数值标签 (一个非常有用的技巧!)
for bar in bars:height = bar.get_height()ax.annotate(f'{height}',xy=(bar.get_x() + bar.get_width() / 2, height),xytext=(0, 3), # 3 points vertical offsettextcoords="offset points",ha='center', va='bottom')plt.tight_layout()
plt.show()

示例 2:分组柱状图

通过控制每个组的X坐标和柱体宽度,可以实现分组对比。

# 数据
labels = ['Q1', 'Q2', 'Q3', 'Q4']
sales_A = [20, 35, 30, 35]
sales_B = [25, 32, 34, 20]
sales_C = [15, 25, 40, 30]x = np.arange(len(labels))  # 标签位置: [0, 1, 2, 3]
width = 0.25  # 柱宽fig, ax = plt.subplots(figsize=(10, 6))# 绘制三组柱体,每组柱体的x坐标偏移一个width
rects1 = ax.bar(x - width, sales_A, width, label='Product A')
rects2 = ax.bar(x, sales_B, width, label='Product B')
rects3 = ax.bar(x + width, sales_C, width, label='Product C')# 添加标签和标题
ax.set_xlabel('Quarters')
ax.set_ylabel('Sales')
ax.set_title('Quarterly Sales by Product')
ax.set_xticks(x) # 设置x轴刻度位置
ax.set_xticklabels(labels) # 设置x轴刻度标签
ax.legend()# 添加数值标签
def autolabel(rects):for rect in rects:height = rect.get_height()ax.annotate('{}'.format(height),xy=(rect.get_x() + rect.get_width()/2, height),xytext=(0, 3),textcoords="offset points",ha='center', va='bottom')autolabel(rects1)
autolabel(rects2)
autolabel(rects3)fig.tight_layout()
plt.show()

示例 3:堆叠柱状图与水平柱状图

# 堆叠柱状图 - 使用 bottom 参数
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))# 数据
men_means = [20, 35, 30, 35]
women_means = [25, 32, 34, 20]
labels = ['Q1', 'Q2', 'Q3', 'Q4']
x = np.arange(len(labels))# 左侧:堆叠柱状图
ax1.bar(labels, men_means, label='Men')
ax1.bar(labels, women_means, bottom=men_means, label='Women') # 关键:bottom=men_means
ax1.set_ylabel('Scores')
ax1.set_title('Stacked Bar Chart')
ax1.legend()# 右侧:水平柱状图 - 非常适合类别名称较长的情况
categories = ['Very Long Category Name A', 'Long Category Name B', 'Category C', 'D']
values = [15, 12, 18, 9]bars = ax2.barh(categories, values)
ax2.set_xlabel('Value')
ax2.set_title('Horizontal Bar Chart')
ax2.grid(axis='x', linestyle='--', alpha=0.7)# 在水平柱体右侧添加数值标签
for bar in bars:width = bar.get_width()ax2.annotate(f'{width}',xy=(width, bar.get_y() + bar.get_height()/2),xytext=(3, 0),textcoords="offset points",ha='left', va='center')plt.tight_layout()
plt.show()

四、 最佳实践与常见陷阱

  1. 最佳实践:
    • 排序数据: 除非有特定顺序要求(如时间),否则将柱体按高度排序,使比较更容易。
    • 从零基线开始: Y轴必须从0开始,否则会扭曲数据的真实比例,误导观众。
    • 添加数值标签: 在柱体顶端或末端直接标注数值,让读者无需猜测。
    • 使用水平柱状图: 当类别名称很长或类别数量很多时,水平柱状图可读性更高。
    • 谨慎使用颜色: 使用颜色来传达信息(如突出特定类别),而不是随意装饰。
  2. 常见陷阱:
    • 过度拥挤: 柱体太多、太窄、间距太小会让图表难以阅读。考虑分组显示或使用其他图表类型(如折线图)。
    • 错误的排序: 随意排序类别会掩盖数据的真实模式。
    • 3D效果: 避免使用3D柱状图,它们会扭曲感知,难以准确比较高度。
    • 混淆柱状图和直方图: 确保你使用的是正确的图表类型来回答你的问题。

五、 总结

plt.bar()plt.barh() 是进行数据对比的利器。

  • 核心功能: 用矩形的高度/长度表示类别数值的大小。
  • 关键参数x/y(位置),height/width(数值),bottom/left(堆叠),color(样式)。
  • 高级应用: 分组柱状图、堆叠柱状图。
  • 关键技巧: 添加数值标签、排序数据、保持零基线。

掌握柱状图,意味着你能够清晰、准确地展示数据之间的比较关系,这是数据故事中不可或缺的一环。在下一篇文章中,我们将深入探讨数据的分布,使用 plt.hist()plt.boxplot() 来揭示数据背后的统计特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94348.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94348.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/94348.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 FastAPI 和 OpenFeature 使用 Feature Flag 控制业务功能

模拟业务场景:多租户系统跨域转账,需要控制某租户下某用户是否可以在某域转账 open_feature_util.py import typing from abc import abstractmethod, ABCMeta from typing import Sequencefrom openfeature.evaluation_context import EvaluationContex…

Stm32通过ESP8266 WiFi连接阿里云平台

本文将介绍stm32如何通过WiFi来连接阿里云,上传数据和接收指令。要先与阿里云建立TCP连接,然后再通过MQTT协议交互。 大体流程:1、在阿里云网页上创建产品和设备;2、stm32通过WiFi连接云平台;3、MQTT连接阿里云&#…

北京-测试-入职甲方金融-上班第三天

今日上班时间9-20.18,再加42分钟就可以拿到75块钱了,但我想回家,所以下班今天上午有人事举办的入职培训,下午有业务培训,培训完领导给我安排了两个需求。慌死,吓死,我都不懂,业务和工…

Java基础第2天总结

使用switch时注意事项:表达式类型只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String,不支持double、float、long(精确度问题,小数有点不精确)。case给出的值不允许重复,且只能是字面量,不…

鸿蒙开发中的List组件详解

目录 引言 1.List组件基础 2.List接口参数 1.space 2.initialIndex 3.scroller 3.ListView的属性 1.listDirection 2.lanes 3.divider 4.scrollBar 4.布局与约束 5.ListItem生命周期 1.使用ForEach创建ListItem 2.使用LazyForEach创建ListItem 3…

2026界计算机专业毕业的有福了!(开题报告任务书)

开题报告 我们以基于Java的婚纱店管理系统为案例进行指导。 任务书: 首先是毕设的立题依据,这个主要描写一些简洁大体的大白话,描述一下你为什么要做这个题目的毕设。 那就需要你描述一下现阶段社会面婚纱店的运营情况,写一些…

安全、高效、可靠的物理隔离网络安全专用设备———信刻光盘安全隔离与文件单向导入系统!

着各种数据传输、储存技术、信息技术的快速发展,保护信息安全是重中之重。军工企业、政府、部队及企事业单位等利用A网与B网开展导入/导出相关工作已成为不可逆转的趋势。针对于业务需要与保密规范相关要求,涉及重要秘密信息,需做到完全的物理…

JetPack 与 PyTorch 版本对应及资源详情

下载链接 JetPack 版本适配 PyTorch 版本发布日期可下载资源(.whl 安装包 / 文档)JP 6.1PyTorch 2.5.0a0(构建号:872d972e41.nv24.08.17622132)2024/10/01- torch-2.5.0a0872d972e41.nv24.08.17622132-cp310-cp310-li…

【c++进阶系列】:万字详解多态

🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 你以为自己在孤独地爬坡吗?看看身后吧——那些被汗水浸湿的脚印,早已连成一道向上的阶梯 ★★★ 本文前置知识&am…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月23日第168弹

从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀4-5个和值,可以做到100-300注左右。(1)定位…

分布式搜索(Elasticsearch)深入用法

目录 数据聚合 聚合的种类 DSL实现聚合 桶聚合 度量聚合 RestAPI实现聚合 多条件聚合 自动补全 拼音分词器 自定义分词器 自动补全查询 实现搜索框自动补全 数据同步 数据同步思路分析 实现elasticsearch与数据库数据同步 集群 搭建ES集群 集群脑裂问题 集群…

java:接口与实现类

1. Java 基础层面接口(Interface) 只是方法的定义/规范,里面没有真正的逻辑。例如:public interface IBookService {boolean save(Book book); }👉 这里只说明了:我要有一个 save 方法,但“怎么…

Chrome 插件开发实战:从入门到进阶

1.1 Chrome 插件的魅力与应用场景Chrome 插件是增强 Chrome 浏览器功能的得力助手,能实现广告拦截、密码管理、标签管理等实用功能。在日常办公中,我们可以借助插件提升效率,如自动填充表单、快速保存网页内容;在浏览网页时&#…

通过官方文档详解Ultralytics YOLO 开源工程-熟练使用 YOLO11实现分割、分类、旋转框检测和姿势估计(附测试代码)

目录 前言: 1.了解ultralytics工程与yolo模型 1.1 yolo11可以为我们做些什 1.2 yolo11模型的高性能 1.3 对于yolo11一些常见的问题 1.3.1 YOLO11 如何以更少的参数实现更高的精度? 1.3.2 YOLO11 可以部署在边缘设备上吗? 2. 深入了解y…

vue实现小程序oss分片上传

随着小程序越来越普及,小程序上传文件必不可少,那么上传的文件大小就不可控了,小则几mb,大到好几百mb,小文件还可以,但是一到超过200mb或稍微再大些的小程序就很容易上传失败,导致功能不能继续进行。以下我们就来解决这个问题,将大文件实现分片上传 温馨提示,不要看内…

14.Shell脚本修炼手册--玩转循环结构(While 与 Until 的应用技巧与案例)

while 循环和 until 循环的应用实践 文章目录while 循环和 until 循环的应用实践当型和直到型循环:两种 "重复" 的逻辑while 循环:满足条件就继续until 循环:不满足条件就继续基础示例:从简单场景学用法示例 1&#xff…

chromadb使用hugging face模型时利用镜像网站下载注意事项

chromadb默认使用sentence-transformers/all-MiniLM-L6-v2的词嵌入(词向量)模型,如果在程序首次运行时,collection的add或query操作时如果没有指定embeddings或query_embeddings,程序会自动下载相关嵌入向量模型&#…

基于大模型的对话式推荐系统技术架构设计

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》(跟我一起学人工智能)【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷…

第1章 React组件开发基础

在掌握React开发之前,我们需要先建立扎实的组件开发基础。这些基础知识不仅影响你的开发效率,更决定了应用程序的性能、可维护性和团队协作的顺畅程度。 本章将深入探讨React组件开发的核心技巧,从JSX语法优化到组件架构设计,帮你建立正确的React开发思维模式。 🗂️ 本…

【yocto】Yocto Project 配置层(.conf)文件语法详解

【加关注,不迷路,持续输出中...】Yocto Project 是一个开源的嵌入式 Linux 系统构建框架,其核心是通过元数据(Metadata)来定义如何构建系统。这些元数据主要包括配方(.bb / .bbappend)、配置&am…