杰瑞科技汇

Matplotlib库Python如何入门?

什么是 Matplotlib?

Matplotlib 是 Python 的一个绘图库,它提供了丰富的命令 API,让用户能轻松地创建高质量的静态、动态和交互式图表,它是 Python 数据科学领域可视化的基石,许多其他高级可视化库(如 Seaborn、Pandas 的内置绘图功能)都是基于它构建的。

核心概念:三层架构

理解 Matplotlib 的三层架构对于掌握它至关重要,这让你知道什么时候需要“深入底层”进行精细控制,什么时候可以使用“便捷接口”快速出图。

  1. 后端层

    • 作用:处理图表的渲染和显示,它决定了图表是在屏幕上显示出来,还是保存为图片文件(如 PNG, PDF, SVG)。
    • 常用后端
      • Qt5Agg:在独立的窗口中显示图表。
      • Agg:不显示图表,只用于将图表保存为文件(常用于服务器环境)。
    • 通常我们不需要直接操作这一层,但了解它有助于解决显示问题。
  2. 艺术家层

    • 作用:这是 Matplotlib 的核心,图表上的所有元素(如 Figure, Axes, Line2D, Text, Axis 等)都是 Artist 对象,你可以通过创建和操作这些对象来精细地控制图表的每一个细节。
    • 适用场景:当你需要创建复杂的、定制化的图表时,直接操作 Artist 对象是最佳选择。
    • 优点:灵活性极高,可以实现任何你想要的视觉效果。
  3. 脚本层 (Scripting Layer - pyplot)

    • 作用:这是我们最常接触的一层。pyplot 模块提供了一个类似 MATLAB 的接口,它简化了绘图过程,你只需要调用一系列函数(如 plt.plot(), plt.title()),pyplot 就会帮你处理底层 Artist 对象的创建和管理工作。
    • 适用场景:快速绘制常见的图表,进行数据探索和初步分析。
    • 优点:简单、直观、易于上手。

对于初学者来说,我们主要学习脚本层 (pyplot),然后逐步了解如何使用艺术家层进行定制。


快速上手:第一个 Matplotlib 图表

安装

如果尚未安装,可以通过 pip 安装:

pip install matplotlib

一个简单的折线图

这是最经典的 "Hello, World!" 示例。

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() 创建一个图表窗口,可以指定大小、 dpi 等
plt.figure(figsize=(8, 6)) # 设置图表大小为 8x6 英寸
# 3. 绘制数据
plt.plot(x, y, label='sin(x)', color='blue', linestyle='--')
# 4. 添加图表元素 (让图表更易读)"Sine Wave") # 标题
plt.xlabel("X-axis")   # X轴标签
plt.ylabel("Y-axis")   # Y轴标签
plt.grid(True)         # 显示网格
plt.legend()           # 显示图例
# 5. 显示或保存图表
plt.show() # 显示图表

运行这段代码,你会弹出一个窗口,显示一个漂亮的正弦波曲线。


核心组件详解

当你调用 plt.plot() 时,Matplotlib 在背后自动创建了一系列对象,理解这些对象是进阶的关键。

  • Figure (图表):整个图表的顶级窗口或容器,你可以把它想象成一张画布,一个 Figure 可以包含一个或多个 Axes。
  • Axes (坐标系/子图):一个 Axes 是一个带有刻度和标签的特定绘图区域,这是你真正绘制数据(如折线、柱状图)的地方,一个 Figure 可以有多个 Axes。
  • Axis (坐标轴):指 X 轴、Y 轴或 Z 轴,它们负责设置刻度、标签和刻度线。
  • Artist (艺术家):所有在图表上可见的元素都是 Artist 对象,包括 Figure, Axes, Axis, Line2D, Text, Rectangle 等。

面向对象的方式绘图

虽然 plt.plot() 很方便,但在复杂图表中,直接操作 Figure 和 Axes 对象是更稳健和清晰的方式。

import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
x = np.linspace(0, 10, 100)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 2. 创建一个 Figure 和一个 Axes (1x1网格,第一个子图)
fig, ax = plt.subplots(figsize=(10, 6))
# 3. 在 Axes 对象上绘图
ax.plot(x, y_sin, label='sin(x)', color='blue', linestyle='-', linewidth=2)
ax.plot(x, y_cos, label='cos(x)', color='red', linestyle='-', linewidth=2)
# 4. 在 Axes 对象上添加元素
ax.set_title("Sine and Cosine Waves") # 使用 set_ 前缀
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.grid(True)
ax.legend()
# 5. 显示图表
plt.show()

对比

  • plt.title() -> ax.set_title()
  • plt.xlabel() -> ax.set_xlabel()
  • plt.plot() -> ax.plot()

这种方式的好处是,如果你想在一张图上画多个子图,会非常清晰。


常用图表类型

Matplotlib 支持几乎所有你能想到的 2D 图表。

折线图

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

plt.plot(x, y)

散点图

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

x = np.random.rand(50)
y = np.random.rand(50)
plt.scatter(x, y, alpha=0.5) # alpha 设置透明度

柱状图

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

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

直方图

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

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

饼图

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

sizes = [25, 35, 20, 20]
labels = ['Q1', 'Q2', 'Q3', 'Q4']
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.axis('equal') # 保证饼图是圆的

箱线图

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

data = [np.random.normal(0, std, 100) for std in range(1, 4)]
plt.boxplot(data, labels=['low', 'medium', 'high'])

高级定制与美化

Matplotlib 的强大之处在于其高度的可定制性。

设置样式

可以使用 plt.style 来快速切换图表的整体风格。

plt.style.use('seaborn-v0_8-whitegrid') # 使用 'seaborn' 风格
plt.plot(x, y)
plt.show()

常用风格:'ggplot', 'seaborn', 'classic', 'dark_background'

子图

在一张 Figure 上绘制多个图表。

fig, axes = plt.subplots(2, 2, figsize=(12, 10)) # 2行2列的子图网格
# 第一个子图 (左上)
axes[0, 0].plot(x, y_sin)
axes[0, 0].set_title('Sine')
# 第二个子图 (右上)
axes[0, 1].plot(x, y_cos)
axes[0, 1].set_title('Cosine')
# 第三个子图 (左下)
axes[1, 0].scatter(x, y_sin)
axes[1, 0].set_title('Sine Scatter')
# 第四个子图 (右下)
axes[1, 1].hist(y_sin, bins=20)
axes[1, 1].set_title('Sine Histogram')
plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
plt.show()

保存图表

使用 savefig 函数将图表保存为文件。

fig.savefig('my_figure.png', dpi=300, bbox_inches='tight')
# dpi: 分辨率
# bbox_inches='tight': 防止保存的图片被裁剪

Matplotlib vs. Seaborn

特性 Matplotlib Seaborn
定位 基础、底层、灵活 高级、封装、美观
语法 命令式 (plt.plot()) 声明式 (sns.lineplot())
默认样式 相对朴素 美观,统计图表友好
图表类型 通用型图表 侧重于统计图表(如分布图、关系图)
数据格式 通常与 NumPy 数组配合 与 Pandas DataFrame 配合得天衣无缝

最佳实践

  • 探索性数据分析:优先使用 Seaborn,因为它代码更简洁,图表更美观,且能很好地处理 Pandas 数据。
  • 高度定制化图表:在 Seaborn 绘制的基础上,使用 MatplotlibArtist 层进行精细调整。

Matplotlib 是 Python 数据可视化的基石,学习它,你需要:

  1. pyplot 开始:掌握 plt.plot(), plt.title() 等常用函数,快速出图。
  2. 理解核心概念:牢记 Figure, Axes, Axis,并学会面向对象的绘图方法 (fig, ax = plt.subplots()),这是处理复杂图表的关键。
  3. 熟悉常用图表:知道什么场景下用折线图、散点图、柱状图等。
  4. 学习定制美化:通过设置样式、调整颜色、字体、添加注释等方式,让你的图表更专业、更具表现力。

掌握了 Matplotlib,你就拥有了 Python 数据可视化领域的“屠龙之技”,再结合 Seaborn 等高级库,你就可以应对绝大多数数据分析和展示的需求。

分享:
扫描分享到社交APP
上一篇
下一篇