当前位置: 首页 > news >正文

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

Matplotlib 零基础入门总结

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

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

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

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

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

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

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

from matplotlib import pyplot as plt

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

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

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

1. 折线图(最基础)

  • 方法plt.plot()
  • 核心逻辑:默认只传一个列表时,列表作为y值,x值从 0 开始自动递增;若要自定义x值,传两个列表(第一个x、第二个y)。
  • 示例代码
    # 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()展示三维数据的二维等高线(如地形)见下文代码

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

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()有很多美化参数,核心是在括号里加参数名=值

# 示例:画两条美化后的三角函数曲线
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()的美化参数侧重散点的大小、颜色等:

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()可以加标签、阴影、偏移等,让比例更易读:

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 会自动叠加显示:

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]  # 折线图的yplt.bar(x, y_bar)  # 先画柱状图
plt.plot(x, y_line, '-o', color='y')  # 再画折线图(-o:带圆点标记,黄色)

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

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

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([左, 下, 宽, 高])控制画布位置,实现 “大画布 + 小画布” 效果:

x = np.linspace(0,10,20)
y = x*x + 2fig = 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.3axes1.plot(x, y, 'r')  # 大画布画红色曲线
axes2.plot(y, x, 'g')  # 小画布画绿色曲线(x和y互换)

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

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

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

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. 加网格、调整坐标轴范围

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)和文字内容:

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 ())

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

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.01plt.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 不用。
http://www.xdnf.cn/news/1435321.html

相关文章:

  • Java 大视界 --Java 大数据在智能教育学习资源整合与知识图谱构建中的深度应用(406)
  • 如何将大疆无人机拍摄到的图像回传到应急指挥中心大屏?5G单兵图传轻松解决图传问题|伟博视讯
  • Ansible角色:高效开发与管理的秘密
  • Ukey介绍
  • HTML第二课:块级元素
  • 【3D 入门-3】常见 3D 格式对比,.glb / .obj / .stl / .ply
  • Ascend上开发自定义算子接入PyTorch有几种实现方式?
  • Higress云原生API网关详解 与 Linux版本安装指南
  • 企业数字安全守护神:IT运维管理系统全面解析,构建坚不可摧的防护体系
  • 实现自己的AI视频监控系统-第三章-信息的推送与共享3(重点)
  • 数据结构:闭散列 (Closed Hashing)-开放定址法 (Open Addressing)
  • react用useImages读取图片,方便backgroundImage
  • hikvision海康威视sdk调用失败,code为29解决办法
  • 集采与反腐双重压力下,医药销售的破局之道:从资源依赖到价值重构
  • 从结构化到多模态:RAG文档解析工具选型全指南
  • Portainer:Docker可视化管理神器部署与使用攻略
  • 不只是一台玩具车:开源燃料电池机器人HydroBot全揭秘
  • 怎么用redis lua脚本实现各分布式锁?Redisson各分布式锁怎么实现的?
  • Unity通过Object学习原型模式
  • ES6和CommonJS模块区别
  • GNU Make | C/C++项目自动构建入门
  • DevOps运维与开发一体化及Kubernetes运维核心详解
  • Aurobay EDI 需求分析:OFTP2 与 EDIFACT 驱动的汽车供应链数字化
  • DataAgent技术解析:数据智能的未来之路
  • LangGraph 上下文工程权威指南:构建智能、感知、有记忆的 AI 代理
  • Ubuntu平台查看.gz格式压缩文件内容以及利用grep命令过滤搜索内容
  • 《浪浪山小妖怪》知识竞赛来袭!测测你是几级影迷?
  • RL【1】:Basic Concepts
  • 情况三:已经 add ,并且也 commit 了
  • 机器人控制器开发(整体架构2 Lerobot介绍)