杰瑞科技汇

python matplotlib 库

Matplotlib 是 Python 最基础、最核心的绘图库,它功能强大,高度可定制,可以生成从简单的折线图、散点图到复杂的三维图形、统计图表等几乎所有类型的静态、动态和交互式图表,可以说,它是 Python 数据科学可视化工具的基石。

python matplotlib 库-图1
(图片来源网络,侵删)

核心概念:三层结构

理解 Matplotlib 的三层结构是掌握其高级定制的关键:

  1. 后端层

    • 这是 Matplotlib 的最底层,负责处理图形的渲染和显示。
    • 它决定了你的图表是显示在交互式窗口中(如 Qt, Tkinter),还是保存为图片文件(如 PNG, PDF, SVG)。
    • 通常我们不需要直接操作这一层,但了解它有助于解决一些显示问题。
  2. 艺术家层

    • 这是 Matplotlib 的核心,也是面向对象的 API。
    • 图表上的所有元素(如 Figure, Axes, Axis, Line2D, Text 等)都是一个 Artist 对象。
    • 你可以通过创建和修改这些 Artist 对象来精确控制图表的每一个细节,这对于创建复杂的、非标准的图形非常有用。
  3. 脚本层 (Scripting Layer - pyplot)

    python matplotlib 库-图2
    (图片来源网络,侵删)
    • 这是 Matplotlib 提供的最常用、最简单的接口,它是一个过程式的 API。
    • pyplot 模块模仿了 MATLAB 的绘图风格,提供了一系列函数(如 plt.plot(), plt.title())来快速绘图。
    • 它在底层自动管理了 Artist 对象的创建和更新,让你能用更少的代码实现绘图,对于绝大多数日常任务,pyplot 就足够了。

简单比喻

  • 脚本层 (pyplot):像是在用自动挡的汽车,你只需告诉它去哪里(调用函数),它会自动处理换挡、油门等细节。
  • 艺术家层:像是在手动挡的赛车,你可以精确控制每一个部件(Artist 对象),从而获得极致的性能和自定义效果。

基本使用流程 (使用 pyplot)

这是最常见、最简单的绘图方式,一个完整的绘图流程通常包括以下几步:

import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
x = np.linspace(0, 10, 100) # 生成 0 到 10 之间的 100 个点
y = np.sin(x)
# 2. 创建图形和坐标轴
# plt.figure() 可以创建一个画布,但通常可以省略,让 pyplot 自动管理
plt.figure(figsize=(8, 5)) # 可选:指定画布大小
# 3. 绘制图形
plt.plot(x, y, label='sin(x)', color='blue', linestyle='--') # 绘制正弦曲线
# 4. 添加图表元素(让图表更易读)"Sine Wave Plot", fontsize=16) # 标题
plt.xlabel("X-axis", fontsize=12)       # X轴标签
plt.ylabel("Y-axis", fontsize=12)       # Y轴标签
plt.grid(True)                          # 显示网格
plt.legend()                            # 显示图例
# 5. 显示或保存图表
plt.show() # 显示图形(在 Jupyter Notebook 或脚本中)
# plt.savefig("sine_wave.png") # 保存图形为文件

常用图表类型

Matplotlib 支持几乎所有常见的图表类型。

a. 折线图

用于展示数据随时间或有序类别的变化趋势。

python matplotlib 库-图3
(图片来源网络,侵删)
plt.plot(x, y)

b. 散点图

用于展示两个变量之间的关系。

x = np.random.rand(50)
y = np.random.rand(50)
plt.scatter(x, y, alpha=0.5)

c. 柱状图

用于比较不同类别的数据大小。

categories = ['A', 'B', 'C', 'D']
values = [15, 30, 45, 10]
plt.bar(categories, values, color='skyblue')

d. 直方图

用于展示数据的分布情况。

data = np.random.randn(1000) # 生成1000个标准正态分布的随机数
plt.hist(data, bins=30, color='green', alpha=0.7)

e. 饼图

用于展示各部分占整体的比例。

sizes = [15, 30, 45, 10]
labels = ['A', 'B', 'C', 'D']
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.axis('equal') # 保证饼图是圆的

f. 箱线图

用于展示数据的分布范围、中位数、异常值等统计信息。

data = np.random.randn(100, 5) # 5组数据,每组100个样本
plt.boxplot(data)
plt.xticks([1, 2, 3, 4, 5], ['Group 1', 'Group 2', 'Group 3', 'Group 4', 'Group 5'])

在 Jupyter Notebook 中使用 Matplotlib

在 Jupyter Notebook 中,为了能让图表直接在单元格内显示,通常需要在代码开头加上 "magic command":

# 这行代码让 Matplotlib 的图表直接在 Notebook 中显示
%matplotlib inline 
import matplotlib.pyplot as plt
import numpy as np
plt.plot([1, 2, 3, 4])
plt.ylabel('Some numbers')
plt.show() # 在 inline 模式下,plt.show() 有时不是必须的,但加上更保险

进阶定制与技巧

a. 使用 subplots 创建子图

当需要在一张图中展示多个图表时,plt.subplots() 非常方便。

fig, axes = plt.subplots(2, 2, figsize=(10, 8)) # 创建一个 2x2 的子图网格,画布大小为 10x8
# 绘制第一个子图 (左上)
axes[0, 0].plot(x, np.sin(x), 'b-')
axes[0, 0].set_title('Sine')
# 绘制第二个子图 (右上)
axes[0, 1].plot(x, np.cos(x), 'r--')
axes[0, 1].set_title('Cosine')
# 绘制第三个子图 (左下)
axes[1, 0].scatter(np.random.randn(50), np.random.randn(50))
axes[1, 0].set_title('Scatter')
# 绘制第四个子图 (右下)
axes[1, 1].bar(['A', 'B', 'C'], [3, 7, 2])
axes[1, 1].set_title('Bar')
# 调整子图间距,防止标签重叠
plt.tight_layout()
plt.show()

b. 使用面向对象的方式

当图形变得复杂时,直接操作 Axes 对象会更清晰。

fig, ax = plt.subplots(figsize=(8, 6))
# ax 是一个 Axes 对象,我们直接在它上面绘图
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
# 直接在 ax 对象上设置属性
ax.set_title("Trigonometric Functions")
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.grid(True)
ax.legend()
plt.show()

c. 样式设置

Matplotlib 提供了多种内置样式,可以快速美化图表。

# 查看所有可用的样式
print(plt.style.available)
# 使用一种样式
plt.style.use('seaborn-v0_8-whitegrid') # 这是一个非常受欢迎的样式
plt.plot(x, np.sin(x))"Styled Plot")
plt.show()

与其他库的关系

Matplotlib 是整个 Python 可视化生态的基石。

  • Pandas: Pandas 的 .plot() 方法底层就是调用了 Matplotlib,这使得可以直接在 DataFrame 或 Series 上快速绘图。
    import pandas as pd
    df = pd.DataFrame({'A': np.random.randn(100).cumsum(),
                       'B': np.random.randn(100).cumsum()},
                      index=pd.date_range('20250101', periods=100))
    df.plot() # 等同于 df.plot.line()
    plt.show()
  • Seaborn: Seaborn 是一个基于 Matplotlib 的高级统计绘图库,它提供了更美观的默认样式和更简单的函数来绘制复杂的统计图表(如热力图、小提琴图等),Seaborn 在底层仍然使用 Matplotlib 进行渲染。
  • Plotly: Plotly 是一个用于创建交互式、动态图表的库,它生成的图表可以在浏览器中进行缩放、悬停查看数据点等操作。

特性 描述
定位 Python 数据可视化的基石,功能最全面。
优点 - 功能强大,支持几乎所有图表类型
- 高度可定制,能精确控制每个元素
- 庞大的社区和丰富的文档
- 是其他高级库(如 Seaborn)的基础
缺点 - 语法相对繁琐,默认样式不够美观
- 对于复杂图表,代码量可能较大
适用场景 - 从简单的探索性数据分析到复杂的出版级图表
- 需要精细控制图表的每一个细节时
- 作为其他可视化库的后端引擎

学习建议

  1. pyplot 开始:掌握 plt.plot(), plt.title(), plt.xlabel() 等基本函数,能解决 80% 的日常绘图需求。
  2. 学习 subplots:学会在一个画布上创建多个子图,这是数据比较时的必备技能。
  3. 了解面向对象 API:当需要绘制复杂图形或进行深度定制时,切换到 fig, ax 的方式会让你的代码更清晰、更可控。
  4. 结合 Seaborn:当你觉得 Matplotlib 的默认样式不够好,或者想快速绘制统计图表时,直接使用 Seaborn,它会让你的图表更漂亮、代码更简洁。
分享:
扫描分享到社交APP
上一篇
下一篇