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 模式)

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

复制代码
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 自动创建 figureaxes,所有操作都通过 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 迁移
可维护性 高,逻辑清晰,不易出错 低,多子图易混淆
官方推荐 官方推荐标准写法 仅用于快速绘图
相关推荐
M78佐菲1 小时前
ARM学习笔记(1)
linux·arm开发·笔记·嵌入式硬件·学习
益达丫3 小时前
Socket编程揭秘:端口、IP与进程通信的底层逻辑
linux·笔记
无敌贵点大王4 小时前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
是翎5 小时前
深度长文|2026产品经理AI实践手册
人工智能·深度学习·学习·自然语言处理·数据挖掘
Linux-lucky6 小时前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
知识分享小能手7 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
马可家的菠萝8 小时前
你收藏的资料,有多少真的被你第二次打开过?
笔记·知识管理·效率提升·个人知识库
小刘在重生~9 小时前
Java Lock 显式锁案例|ReentrantLock 解决多线程安全问题(超详细实战)
java·笔记·面试
职豚求职小程序9 小时前
中国人寿27秋招笔试[特殊字符]北森机考|备考攻略
笔记
江湖人称菠萝包9 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter9-Qt Charts
笔记·qt·qt5