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

目录

      • [Matplotlib 可视化大师系列博客总览](#Matplotlib 可视化大师系列博客总览)
  • [Matplotlib 可视化大师系列(三):plt.bar() 与 plt.barh() - 清晰对比的柱状图](#Matplotlib 可视化大师系列(三):plt.bar() 与 plt.barh() - 清晰对比的柱状图)
    • [一、 柱状图是什么?何时使用?](#一、 柱状图是什么?何时使用?)
    • [二、 函数原型与核心参数](#二、 函数原型与核心参数)
      • [`plt.bar(x, height, ...)` - 垂直柱状图](#plt.bar(x, height, ...) - 垂直柱状图)
      • [`plt.barh(y, width, ...)` - 水平柱状图](#plt.barh(y, width, ...) - 水平柱状图)
    • [三、 从入门到精通:代码示例](#三、 从入门到精通:代码示例)
      • [示例 1:基础垂直柱状图](#示例 1:基础垂直柱状图)
      • [示例 2:分组柱状图](#示例 2:分组柱状图)
      • [示例 3:堆叠柱状图与水平柱状图](#示例 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, ...) - 垂直柱状图

python 复制代码
plt.bar(x, height, width=0.8, bottom=None, *, align='center', **kwargs)

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

python 复制代码
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:基础垂直柱状图

python 复制代码
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 offset
                textcoords="offset points",
                ha='center', va='bottom')

plt.tight_layout()
plt.show()

示例 2:分组柱状图

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

python 复制代码
# 数据
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:堆叠柱状图与水平柱状图

python 复制代码
# 堆叠柱状图 - 使用 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() 来揭示数据背后的统计特性。

相关推荐
Elastic 中国社区官方博客8 小时前
在 Elasticsearch 中使用原生 PromQL 支持查询 Prometheus 指标
大数据·elasticsearch·搜索引擎·信息可视化·全文检索·prometheus
Elastic 中国社区官方博客11 小时前
Elastic 9.4:Workflows 正式发布、Agent Builder 更新,以及 Prometheus / PromQL 支持
运维·数据库·人工智能·elasticsearch·搜索引擎·信息可视化·prometheus
技术小黑15 小时前
CNN算法实战系列02 | ResNet50V2算法实战与解析
pytorch·深度学习·算法·cnn
Febu418 小时前
Nano-vLLM-MS
pytorch·深度学习·transformer
chatexcel19 小时前
ChatExcel AIPPT实测:基于Excel数据生成PPT,覆盖图表可视化与办公汇报
信息可视化·powerpoint·excel
麟听科技19 小时前
HarmonyOS 6.0+ PC端工业物联网设备监控APP开发实战:Modbus协议适配与实时数据可视化落
物联网·信息可视化·harmonyos
财经资讯数据_灵砚智能21 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月8日
大数据·人工智能·python·信息可视化·自然语言处理
盼小辉丶21 小时前
PyTorch强化学习实战——使用交叉熵方法解决 FrozenLake 环境
人工智能·pytorch·python·强化学习
Highcharts.js1 天前
专为软件团队打造的数据可视化开发工具|Highcharts图表
开发语言·信息可视化·highcharts·实战代码
Highcharts.js1 天前
Highcharts 助力医疗与生命科学研究的数据分析|让医学数据轻易呈现
开发语言·信息可视化·highcharts·实战代码·响应式图表