【机器学习学习笔记】Matplotlib 基本操作

Matplotlib 零基础入门总结

Matplotlib 是 Python 中最常用的开源绘图库,能画折线图、柱状图、散点图等多种 2D 图形,操作简单且文档完善,不管是 Python 工程师、科研学者还是数据工程师都经常用它。下面从基础准备、核心绘图知识、图形美化、组合与子图、规范绘图及标注这几个方面,帮零基础小白快速掌握它。

一、基础准备:环境与模块导入

在开始绘图前,需要先做好环境配置和模块导入,这是后续绘图的前提。

1. 环境配置(关键命令)

  • Notebook 环境(如 Jupyter Notebook) :必须先运行魔术命令 %matplotlib inline,作用是把绘制的图形直接嵌入到当前页面,方便查看。
  • 桌面环境 :不需要上面的命令,只需在所有绘图代码写完后,加一句 plt.show(),就能弹出窗口显示图形。

2. 模块导入(固定写法)

Matplotlib 绘图主要依赖pyplot模块,约定俗成简称为plt,导入代码如下:

python 复制代码
from matplotlib import pyplot as plt

后续很多绘图操作,都是通过plt.xxx(xxx 是具体方法)来实现的。

二、核心绘图:常见 2D 图形怎么画

pyplot模块里有各种绘图方法,不同方法对应不同图形,掌握这些基础图形的绘制,就能应对大部分简单需求。

1. 折线图(最基础)

  • 方法plt.plot()

  • 核心逻辑 :默认只传一个列表时,列表作为y值,x值从 0 开始自动递增;若要自定义x值,传两个列表(第一个x、第二个y)。

  • 示例代码

    python 复制代码
    # 1. 只传y值,x默认0、1、2...
    plt.plot([1,2,3,2,1,2,3,4,5,6,5,4,3,2,1])  # 画"山峰"折线图
    
    # 2. 传x和y,自定义x从2开始
    plt.plot([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],  # x值
             [1,2,3,2,1,2,3,4,5,6,5,4,3,2,1])  # y值
    
    # 3. 画正弦曲线(结合numpy生成连续数据)
    import numpy as np  # 先导入数值计算库numpy
    X = np.linspace(-2*np.pi, 2*np.pi, 1000)  # -2π到2π间生成1000个均匀点(x轴)
    y = np.sin(X)  # 计算y值(正弦值)
    plt.plot(X, y)  # 画正弦曲线(看起来是曲线,实际是密集点连的直线)

2. 其他常用图形(方法 + 示例)

除了折线图,柱状图、散点图等也很常用,核心是换plt后的方法名,数据传入逻辑和折线图类似。

图形类型 方法 核心作用 示例代码
柱状图 plt.bar() 展示不同类别数据的大小对比 plt.bar([1,2,3], [1,2,3])(x 为 1、2、3,对应 y 为 1、2、3 的柱子)
散点图 plt.scatter() 展示两个变量的分布关系(如 GPS 经纬度) X=np.random.ranf(1000); y=np.random.ranf(1000); plt.scatter(X,y)(1000 个随机散点)
饼状图 plt.pie() 展示各部分占总体的比例 plt.pie([1,2,3,4,5])(5 部分,比例 1:2:3:4:5)
量场图 plt.quiver() 展示向量方向(如气象风场) X,y=np.mgrid[0:10,0:10]; plt.quiver(X,y)(10x10 网格的箭头)
等高线图 plt.contourf() 展示三维数据的二维等高线(如地形) 见下文代码

等高线图示例代码(稍复杂,需生成网格数据):

python 复制代码
x = np.linspace(-5,5,500)  # x轴500个点
y = np.linspace(-5,5,500)  # y轴500个点
X, Y = np.meshgrid(x, y)  # 生成500x500的网格矩阵
Z = (1 - X/2 + X**3 + Y**4) * np.exp(-X**2 - Y**2)  # 计算等高线值
plt.contourf(X, Y, Z)  # 画等高线图

三、图形美化:让图更 "好看"

默认画的图比较朴素,通过plt.xxx方法的关键字参数(kwargs) ,可以调整颜色、线型、大小等样式,让图形更清晰、美观。

1. 折线图美化(常用参数)

plt.plot()有很多美化参数,核心是在括号里加参数名=值

python 复制代码
# 示例:画两条美化后的三角函数曲线
X = np.linspace(-2*np.pi, 2*np.pi, 1000)
y1 = np.sin(X)  # 正弦
y2 = np.cos(X)  # 余弦

# 正弦曲线:红色(color='r')、虚线(linestyle='--')、线宽2(linewidth=2)、透明度0.8(alpha=0.8)
plt.plot(X, y1, color='r', linestyle='--', linewidth=2, alpha=0.8)
# 余弦曲线:蓝色(color='b')、实线(linestyle='-')、线宽2
plt.plot(X, y2, color='b', linestyle='-', linewidth=2)

2. 散点图美化(常用参数)

plt.scatter()的美化参数侧重散点的大小、颜色等:

python 复制代码
x = np.random.rand(100)  # 100个随机x
y = np.random.rand(100)  # 100个随机y
colors = np.random.rand(100)  # 100个随机颜色(渐变)
size = np.random.normal(50, 60, 100)  # 100个随机大小(均值50,标准差60)

# s=散点大小,c=散点颜色
plt.scatter(x, y, s=size, c=colors)

3. 饼状图美化(常用参数)

plt.pie()可以加标签、阴影、偏移等,让比例更易读:

python 复制代码
label = ['Cat','Dog','Cattle','Sheep','Horse']  # 类别标签
color = ['r','g','r','g','y']  # 每个类别的颜色
size = [1,2,3,4,5]  # 每个类别的占比数据
explode = (0,0,0,0,0.2)  # 最后一个类别(Horse)向外偏移0.2(突出显示)

# autopct='%1.1f%%':显示百分比(保留1位小数);shadow=True:加阴影
plt.pie(size, colors=color, explode=explode, labels=label, shadow=True, autopct='%1.1f%%')
plt.axis('equal')  # 让饼状图呈正圆形(否则可能是椭圆)

四、组合图与子图:多图一起展示

实际需求中,常需要把多个图形放在一起(如折线图 + 柱状图),或把多个独立图按顺序排列(子图),核心是 "共享坐标" 或 "管理画布"。

1. 组合图(同一坐标下多图)

只要多个图形的横坐标相同,把绘图代码写在一起,Matplotlib 会自动叠加显示:

python 复制代码
x = [1,3,5,7,9,11,13,15,17,19]  # 共享x轴
y_bar = [3,4,6,8,9,10,9,11,7,8]  # 柱状图的y
y_line = [2,3,5,7,8,9,8,10,6,7]  # 折线图的y

plt.bar(x, y_bar)  # 先画柱状图
plt.plot(x, y_line, '-o', color='y')  # 再画折线图(-o:带圆点标记,黄色)

2. 子图(多图按行列排列)

plt.subplots(nrows=行数, ncols=列数)创建子图,再逐个绘制,适合展示多个独立图形。

python 复制代码
x = np.linspace(0,10,20)  # 通用x数据
y = x*x + 2  # 通用y数据

# 1. 1行2列的子图(nrows=1, ncols=2)
fig, axes = plt.subplots(nrows=1, ncols=2)  # fig=画板,axes=两个子图的画布列表
axes[0].plot(x, y, 'r')  # 第一个子图(索引0):红色曲线
axes[1].plot(y, x, 'g')  # 第二个子图(索引1):绿色曲线(x和y互换)

# 2. 调整子图尺寸和精度(figsize=宽高,dpi=清晰度)
fig, axes = plt.subplots(nrows=1, ncols=4, figsize=(16,5))  # 1行4列,宽16高5
n = np.array([0,1,2,3,4,5])
axes[0].scatter(x, x+0.25*np.random.randn(len(x)))  # 子图1:散点图
axes[1].step(n, n**2, lw=2)  # 子图2:梯步图
axes[2].bar(n, n**2, align="center", width=0.5, alpha=0.5)  # 子图3:柱状图
axes[3].fill_between(x, x**2, x**3, color="green", alpha=0.5)  # 子图4:面积图

3. 大图套小图(自定义画布位置)

fig.add_axes([左, 下, 宽, 高])控制画布位置,实现 "大画布 + 小画布" 效果:

python 复制代码
x = np.linspace(0,10,20)
y = x*x + 2

fig = plt.figure()  # 新建画板
axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8])  # 大画布:左0.1、下0.1、宽0.8、高0.8
axes2 = fig.add_axes([0.2, 0.5, 0.4, 0.3])  # 小画布:左0.2、下0.5、宽0.4、高0.3

axes1.plot(x, y, 'r')  # 大画布画红色曲线
axes2.plot(y, x, 'g')  # 小画布画绿色曲线(x和y互换)

五、规范绘图:加标题、图例、网格等

专业的图需要清晰的标注,比如标题、坐标轴名称、图例等,通过axes对象的方法可以添加这些元素,让图更易理解。

1. 加标题、坐标轴名称、图例

python 复制代码
x = np.linspace(0,10,20)
fig, axes = plt.subplots()

# 1. 坐标轴名称(xlabel、ylabel)
axes.set_xlabel('x label')  # x轴名称
axes.set_ylabel('y label')  # y轴名称

# 2. 图形标题(title)
axes.set_title('Title: y = x² and y = x³')

# 3. 画两条曲线
axes.plot(x, x**2)  # 第一条:y=x²
axes.plot(x, x**3)  # 第二条:y=x³

# 4. 图例(legend):说明每条线代表什么
# loc=0:自适应位置;loc=1~4:分别是右上、左上、左下、右下
axes.legend(["y = x²", "y = x³"], loc=0)

2. 加网格、调整坐标轴范围

python 复制代码
x = np.linspace(0,10,20)
fig, axes = plt.subplots(1,2, figsize=(10,5))  # 1行2列子图,宽10高5

# 子图1:显示网格(grid=True)
axes[0].plot(x, x**2, x, x**3, lw=2)  # 画两条线(线宽2)
axes[0].grid(True)  # 显示网格

# 子图2:调整坐标轴范围(xlim、ylim)
axes[1].plot(x, x**2, x, x**3)
axes[1].set_ylim([0,60])  # y轴范围:0~60
axes[1].set_xlim([2,5])   # x轴范围:2~5

六、图像标注:加文字、箭头

复杂图形需要额外标注(如突出最小值、解释特殊点),用plt.text()加文字,plt.annotate()加箭头。

1. 文字标注(plt.text ())

在柱状图上标注具体数值,核心是确定标注的位置(x、y)和文字内容:

python 复制代码
fig, axes = plt.subplots()

x_bar = [10,20,30,40,50]  # 柱状图x坐标
y_bar = [0.5,0.6,0.3,0.4,0.8]  # 柱状图y坐标(柱子高度)
bars = axes.bar(x_bar, y_bar, color='blue', width=2)  # 画柱状图

# 遍历每个柱子,加文字标注
for i, rect in enumerate(bars):
    x_text = rect.get_x()  # 获取柱子的x坐标(左边缘)
    y_text = rect.get_height() + 0.01  # 文字y坐标:柱子高度+0.01(避免和柱子重叠)
    plt.text(x_text, y_text, '%.1f' % y_bar[i])  # 标注文字(保留1位小数)

2. 箭头标注(plt.annotate ())

在文字标注基础上,加箭头指向特殊点(如最小值):

python 复制代码
fig, axes = plt.subplots()

bars = axes.bar(x_bar, y_bar, color='blue', width=2)
# 先加文字标注(同上面代码)
for i, rect in enumerate(bars):
    x_text = rect.get_x()
    y_text = rect.get_height() + 0.01
    plt.text(x_text, y_text, '%.1f' % y_bar[i])

# 加箭头标注:指向"最小值"(y=0.3,x=30)
# xy:箭头终点(指向的点);xytext:箭头起点(文字位置)
# arrowprops:箭头样式(facecolor=颜色,width=箭尾宽,headwidth=箭头宽)
plt.annotate('Min', xy=(32, 0.3), xytext=(36, 0.3),
             arrowprops=dict(facecolor='black', width=1, headwidth=7))

总结:零基础绘图流程

  1. 准备 :Notebook 环境用%matplotlib inline,导入pltnumpy(如需数据);
  2. 选图形 :确定画折线图(plt.plot)、柱状图(plt.bar)等,准备 x、y 数据;
  3. 美化 :加colorlinewidth等参数调整样式;
  4. 规范标注 :加标题、图例、网格(用axes.set_xxx);
  5. 展示 :桌面环境加plt.show(),Notebook 不用。
相关推荐
一枝小雨3 小时前
【C++】深入解析C++嵌套依赖类型与typename关键字
开发语言·c++·笔记·学习笔记
胡萝卜3.03 小时前
【LeetCode&数据结构】栈和队列的应用
数据结构·学习·算法··队列·栈和队列oj题
mengjiexu_cn3 小时前
强化学习PPO/DDPG算法学习记录
python·学习·算法
人生游戏牛马NPC1号5 小时前
学习 Android (十八) 学习 OpenCV (三)
android·opencv·学习
咸甜适中5 小时前
rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十三)控件中常用文本格式
笔记·学习·rust·egui
茯苓gao5 小时前
变频器实习DAY41 单元测试介绍
笔记·学习·单元测试
苏纪云5 小时前
Ajax笔记(下)
前端·javascript·笔记·ajax
要做朋鱼燕5 小时前
【C++】 Vector容器操作全解析
开发语言·c++·笔记·学习笔记
wb1897 小时前
CICD的持续集成与持续交付和Zabbix
运维·笔记·ci/cd·云计算·zabbix