Python 使用 Matplotlib 与 Pandas 绘制条形图完整指南

程一诺
程一诺
发布时间:2026-10-12| 5人浏览过
原创

本文将详细介绍如何利用 Python 的 Matplotlib 库与 Pandas 框架快速绘制纵向分组条形图与横向条形图。通过合理配置中文字体、定义坐标轴位置、处理结构化数据并调用对应的绘图接口,开发者可以直观对比多组分类指标的数值差异,有效替代传统表格展示,广泛应用于毕业设计与数据分析报告中。

核心目标与适用场景

在数据处理过程中,当类别较多且需要对比各分类下多个子项的数值时,条形图能比纯表格更直观地凸显数据间的差距。Python 生态提供了两种主流绘图方式:一是基于 Matplotlib 面向对象接口手动控制柱体偏移量与样式;二是借助 Pandas 内置的 DataFrame 对象,一键生成整齐排列的横向或纵向图表。以下将分别演示这两种方法的完整实现流程。

环境准备与依赖说明

运行示例前,请确保 Python 环境已安装相关库。可通过终端执行安装命令:

pip install matplotlib pandas numpy

第1步:初始化字体与绘图环境

目的:解决 Windows/Linux 默认环境渲染中文时的方框乱码问题,并关闭负号显示异常。入口为 Python 脚本顶部或 Jupyter Notebook 单元格。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib

# 配置中文字体(FangSong 为仿宋,若系统缺失可替换为 'SimHei' 黑体)
matplotlib.rcParams['font.sans-serif'] = ['FangSong', 'SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

纵向分组条形图实现

第2步:定义数据源与坐标轴参数

目的:明确每个子类的横坐标分布位置与柱宽,避免柱体重叠。操作时需计算步长与偏移量。

# 定义9组数据序列
c101 = (8,7,3,7,10,4,11,8,11,10,8,9)
c102 = (21,21,24,25,16,17,11,24,24,25,36,33)
c103 = (4,4,10,3,9,8,12,2,4,5,2,6)
c104 = (1,5,1,3,2,3,3,3,6,5,1,0)
c105 = (3,1,0,1,3,3,1,2,0,0,0,0)
c106 = (1,2,0,0,1,1,0,0,1,1,0,0)
c107 = (1,0,1,0,0,1,0,0,0,0,0,0)
c108 = (0,1,0,0,0,2,1,1,0,1,0,0)
c109 = (1,0,1,1,0,0,1,1,0,0,0,0)

# 设置X轴刻度位置(步长为2,覆盖12个班级区间)
ind = np.arange(0, 24, 2)
bar_width = 0.25  # 单根柱子的宽度

fig, ax = plt.subplots(figsize=(8, 4))

第3步:批量绘制柱体并添加标注

目的:利用循环或连续调用 ax.bar() 绘制错位排列的分组条形图,并配置图例与标题。

# 依次绘制9个序列,通过 ind + N*width 控制水平偏移
labels = ['1班', '2班', '3班', '4班', '5班', '6班', '7班', '8班', '9班', '10班', '11班', '12班']
colors = ['SkyBlue', 'IndianRed', 'Cyan', 'Magenta', 'Purple', 'Green', 'Yellow', 'Blue', 'Orange']
series_data = [c101, c102, c103, c104, c105, c106, c107, c108, c109]

for i, series in enumerate(series_data):
    ax.bar(ind + (i+1) * bar_width, series, width=bar_width, color=colors[i], align='edge', label=f'系列{str(i+101)}')

# 设置X轴标签与图例位置
ax.set_xticks(ind)
ax.set_xticklabels(labels)
ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.05))

plt.tight_layout()
plt.show()
Matplotlib纵向分组条形图运行结果,清晰展示1至12班共9组指标的数值对比
横向错位排列的分组柱状图,图例位于顶部居中

基于DataFrame的横向条形图

第4步:构建规范化二维数据表

目的:将分散的元组数据转换为行列索引明确的 DataFrame 对象,便于 Pandas 直接识别数据结构。注意原始列表中部分行元素数量不一致会导致绘图警告,此处已统一补齐至相同长度。

data = [
    [8, 21, 4, 1, 3, 1, 1, 0, 1],
    [7, 21, 4, 5, 1, 2, 0, 1, 0],
    [3, 24, 10, 1, 0, 0, 1, 0, 1],
    [7, 25, 3, 3, 1, 0, 0, 0, 1],
    [10, 16, 9, 2, 3, 1, 0, 0, 0],
    [4, 17, 8, 3, 3, 1, 1, 2, 0],
    [11, 11, 12, 3, 1, 0, 0, 1, 1],
    [8, 24, 2, 3, 2, 0, 0, 1, 1],
    [11, 24, 4, 6, 0, 1, 0, 0, 0],
    [10, 25, 5, 5, 0, 1, 0, 1, 0],
    [8, 36, 2, 1, 0, 0, 0, 0, 0],
    [9, 33, 6, 0, 0, 0, 0, 0, 0]
]

df = pd.DataFrame(data,
                  index=['1班','2班','3班','4班','5班','6班','7班','8班','9班','10班','11班','12班'],
                  columns=pd.Index(['101','102','103','104','105','106','107','108','109']))

第5步:调用内置接口渲染横向图表

目的:利用 plot(kind='barh') 快速生成以行为主轴的横向条形图,大幅缩减样板代码。此方法适合快速探索性数据分析。

plt.figure(figsize=(6, 8))
df.plot(kind='barh', fontsize=10, color='#1f77b4')
plt.xlabel('数值大小')
plt.ylabel('班级')
plt.title('各班各类指标横向对比')
plt.tight_layout()
plt.show()
Pandas DataFrame横向条形图运行结果,Y轴按班级降序排列,直观显示各组占比情况
Pandas自动解析矩阵生成的横向条形图

关键参数核对与完成判断

  • align='edge':确保柱体左边缘严格对齐刻度线,配合自定义 width 可实现精确分组。
  • df.plot(kind='barh'):自动生成横向布局,Y轴自动映射 DataFrame 的索引,无需手动切换坐标轴方向。
  • plt.tight_layout():自动裁剪重叠文本与图例,保证导出图片时坐标轴不被截断。

常见排错指引

  1. 中文显示为方块:检查系统是否安装指定字体。Windows 常用 'SimHei',macOS 常用 'Arial Unicode MS',Linux 需提前安装对应字体文件并更新字体缓存。
  2. 交互式窗口无响应或空白:若在 Jupyter Notebook 环境中运行首段代码,需在开头添加魔法命令 %matplotlib inline 或 %matplotlib widget 替代标准 plt.show()。
  3. NaN 警告或图形断裂:Pandas 绘图对缺失值敏感。输入二维列表时务必保证每行元素个数一致,或使用 df.fillna(0) 预处理。

简要总结

掌握 Matplotlib 底层位移逻辑与 Pandas 高级封装语法后,即可根据数据形态灵活选择纵向分组或横向对比布局。上述代码已涵盖字体适配、坐标校准、图例定位及异常值修复等核心环节,可直接嵌入自动化报告流水线中。

以上就是 Python 使用 Matplotlib 和 Pandas 绘制条形图的详细内容,更多关于 Python 数据可视化实战的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。