Matplotlib实践学习笔记

第二章 艺术画笔见乾坤

一.Matplotlib的概念

Matplotlib 是 Python 生态中最核心、最基础的 2D 数据可视化库,被称为 Python 数据可视化的 "泰斗"。

  • 核心能力:生成出版级质量的静态、动态、交互式图表,支持折线图、柱状图、散点图、饼图等几乎所有常见图表类型。
  • 应用场景:可用于 Python 脚本、Jupyter Notebook、Web 应用、GUI 工具等,是 pandas、seaborn 等高级可视化库的底层基础(这些库本质是对 Matplotlib 的封装)。
  • 核心优势:高度可定制化,能精准控制图表的每一个细节(线条、颜色、标签、字体等),是数据分析师、科研人员的必备工具。

二、一个最简单的绘图例子

Matplotlib 绘图的核心是两个层级:

  1. Figure(画布):整个图表的最外层容器,相当于我们画图的 "纸",可以是窗口、Jupyter 单元格等。
  2. Axes(坐标轴 / 子图):画在 Figure 上的、带坐标系的绘图区域,一个 Figure 可以包含 1 个或多个 Axes。

简单来说:Figure 是画布,Axes 是画布上的画纸,所有的图表元素(线条、标签、刻度)都画在 Axes 上。

1.面向对象式

这是 Matplotlib 官方推荐的标准写法,适合复杂图表和精细化控制

复制代码
# 1. 导入依赖库
import matplotlib.pyplot as plt
import numpy as np

# 2. 创建画布(figure)和坐标轴(axes)
fig, ax = plt.subplots()  # 默认创建1个Axes,也可指定行列数,如 plt.subplots(2,1) 创建2行1列的子图

# 3. 在Axes上绘制折线图
# plot(横坐标列表, 纵坐标列表)
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 4. 显示图表(Jupyter中可省略,脚本中必须加)
plt.show()

运行效果:

2.pyplot 式

这种写法模仿 MATLAB 的语法,自动创建 Axes,适合快速绘图、简单场景。

复制代码
# 导入依赖库
import matplotlib.pyplot as plt

# 直接调用 plt.plot() 绘图,Matplotlib 自动创建 Figure 和 Axes
plt.plot([1, 2, 3, 4], [1, 4, 2, 3])

# 显示图表
plt.show()

运行效果:

三、Figure 的组成

1.Matplotlib 的图表是一个层级化的容器结构,从顶层到底层依次为:

层级 名称 核心作用 对应操作
顶层 Figure(画布) 整个图表的最外层容器,容纳所有绘图元素 plt.figure() / fig = plt.figure()
核心 Axes(子图 / 坐标轴区域) Matplotlib 的核心,一个 Figure 可包含 1 个或多个 Axes,是真正的绘图区域 fig.subplots() / ax = plt.subplots()
从属 Axis(坐标轴) Axes 的下属层级,处理坐标轴、网格等相关元素 ax.xaxis / ax.yaxis
底层 Tick(刻度) Axis 的下属层级,处理刻度、刻度标签等细节 ax.xaxis.set_major_locator() 等

2.完整图表的所有元素

1. 基础容器类

  • Figure:最外层画布,控制图表大小、背景色等
  • Axes:子图区域,所有绘图操作的核心载体
  • Spine(坐标轴脊线) :包围 Axes 的四条边框,可隐藏、修改样式(ax.spines)

2. 坐标轴与刻度类

  • Axis(x/y 轴):坐标轴对象,控制轴的范围、样式
  • Major tick(主刻度) :主刻度线,对应大的数值标记(ax.yaxis.set_major_locator)
  • Minor tick(次刻度) :次刻度线,用于更精细的刻度划分(ax.yaxis.set_minor_locator)
  • Major/Minor tick label(刻度标签) :刻度上的文字,可自定义格式(set_major_formatter)
  • xlabel /ylabel(坐标轴标签) :坐标轴的说明文字(ax.set_xlabel() / ax.set_ylabel())

3. 数据与装饰类

  • Line(线条) :折线图的线条,通过 ax.plot() 绘制
  • Markers(标记) :散点图的标记点,通过 ax.scatter() 绘制
  • Title(标题) :图表的标题(ax.set_title())
  • Grid(网格线) :背景网格,辅助读数(ax.grid())
  • Legend(图例) :标注不同数据系列的含义(ax.legend())

四、两种核心绘图接口详解

Matplotlib 提供了两种完全等效的绘图方式,适用于不同场景:

1. 面向对象式(OO 模式)

核心逻辑 :显式创建 figure 和 axes 对象,所有操作都通过对象方法完成,逻辑清晰、可维护性高。

复制代码
import matplotlib.pyplot as plt
import numpy as np

# 1. 生成数据:0到2之间取100个等间距点
x = np.linspace(0, 2, 100)

# 2. 显式创建figure和axes
fig, ax = plt.subplots()

# 3. 在axes上绘制三条曲线
ax.plot(x, x, label='linear')       # 一次函数 y=x
ax.plot(x, x**2, label='quadratic') # 二次函数 y=x²
ax.plot(x, x**3, label='cubic')     # 三次函数 y=x³

# 4. 配置图表元素
ax.set_xlabel('x label')  # x轴标签
ax.set_ylabel('y label')  # y轴标签
ax.set_title("Simple Plot") # 图表标题
ax.legend()  # 显示图例

# 5. 显示图表(脚本中必须,Jupyter中可省略)
plt.show()
运行效果
  • 优势 :
    • 逻辑清晰,每个操作都明确作用于哪个 axes,多子图场景下不会混淆
    • 高度可定制,适合复杂图表、科研绘图、生产环境
    • 符合 Python 面向对象的编程思想,可维护性强

2. pyplot 式(MATLAB 风格)

核心逻辑 :依赖 pyplot 自动创建 figure 和 axes,所有操作都通过 plt.xxx() 完成,代码极简。

复制代码
import matplotlib.pyplot as plt
import numpy as np

# 1. 生成数据
x = np.linspace(0, 2, 100)

# 2. 直接调用plt.plot绘图,自动创建figure和axes
plt.plot(x, x, label='linear')
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')

# 3. 配置图表元素
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()

# 4. 显示图表
plt.show()
运行效果
  • 优势 :
    • 代码极简,一行绘图,适合快速探索数据、简单可视化
    • 语法和 MATLAB 高度相似,MATLAB 用户上手无压力
  • 劣势 :
    • 多子图场景下容易混淆当前操作的 axes,不适合复杂定制
    • 代码可维护性差,大型项目不推荐

3.两种接口的核心对比

对比维度 面向对象式(OO 模式) pyplot 式(MATLAB 风格)
创建方式 显式创建 fig, ax = plt.subplots() 隐式自动创建,无需手动声明
操作方式 所有操作通过 ax.xxx() 完成 所有操作通过 plt.xxx() 完成
代码复杂度 稍多,需手动创建对象 极简,一行绘图
灵活性 极高,支持多子图、精细化控制 一般,简单场景够用
适用场景 复杂图表、科研绘图、生产环境 快速探索、简单可视化、MATLAB 迁移
可维护性 高,逻辑清晰,不易出错 低,多子图易混淆
官方推荐 官方推荐标准写法 仅用于快速绘图
相关推荐
夕除2 小时前
Redis 过期策略
redis·笔记·面试
Nuanyt4 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
叼烟扛炮5 小时前
Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器
linux·运维·服务器·网络·笔记·学习·tcp/ip
叼烟扛炮5 小时前
Linux 学习笔记(四十四):HTTP 协议解析与极简 Web 服务器实战
linux·服务器·学习
叼烟扛炮6 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
songyuc6 小时前
【Manskill3】TableSceneBuilder学习笔记
pytorch·笔记·学习
外收内放7 小时前
Python基础语法练习题(75)
开发语言·python·学习
゛凌乱的记忆づ8 小时前
好用的md文件编辑器——TyporaS与Typora
笔记·git·typora·markdown
kyrie_sakura8 小时前
大模型学习20 大模型学习 - LangChain3 - Agents
人工智能·学习·langchain
zroooo9 小时前
计算机学习-知识庞大而繁杂
笔记·学习