资讯动态

matplotlib 绘图核心:plot 数据映射、子图布局与公式标注

发布时间:2026/9/17 14:41:10 来源:尧图企业网站定制
简介这是一份面向Python初学者与软件开发人员的数据可视化入门资料围绕matplotlib这一核心绘图库展开帮助读者解决从零搭建图表、理解绘图接口与MATLAB式命令差异的问题。内容涵盖基本画图流程plt.plot、ylabel、show、线型与颜色设置如ro、axis范围、同一图表叠加多条曲线配合numpy数组生成数据、通过setp调整线宽与颜色以及subplot子图布局并延伸到hist直方图、text标注与Tex数学公式等实用技巧。资源为单个PDF文档压缩包约217KB轻量易读适合边看边敲代码对照练习。目前已有155人学习可作为数据分析、科研绘图与软件开发中快速出图的随手参考也可作为系统学习matplotlib前的知识索引与查漏补缺清单。1. 从一份 matplotlib 参照笔记说起为什么 plot 只给一个 list 也能出图很多人第一次写plt.plot([1,2,3])时会愣一下我只给了一组数怎么 X 轴自动就有了 0、1、2这不是 bug而是 pyplot 的默认约定——当plot只收到一组数据时它把这组数据当作 Y 值X 值用range(len(y))自动补齐。这个设计直接沿袭自 matlab 的plot命令也是这份参照笔记一上来就强调「用法基本相同」的原因。对做软件开发和数据可视化的人来说这份资料的定位很清晰它不讲 matplotlib 的架构也不讲 Figure/Axes 的对象模型而是把最常被查的几件事——单曲线、多曲线、线型颜色、subplot 子图、图上标注文本——用交互式 REPL 的输出结果串了一遍。适合刚配好 Python 环境、准备用 matplotlib 画论文图或数据分析图的人也适合从 matlab 迁移过来、想找命令对应关系的熟手对照查阅。下面按「底层约定 → 参数控制 → 多子图组织 → 文本与公式标注」的顺序把它拆开讲透。2. plot 的数据映射规则与线型颜色参数2.1 单参数与双参数的数据映射差异matplotlib 的plot对参数个数有隐式判断这是理解后续所有用法的前提。import matplotlib.pyplot as plt # 情况一只给一组数据视为 Y 值X 自动生成为 0..n-1 plt.plot([1, 2, 3]) plt.ylabel(some numbers) plt.show() # 情况二给两组数据第一组是 X第二组是 Y按 (1,1),(2,4),(3,9) 连线 plt.plot([1, 2, 3], [1, 4, 9]) plt.show()上面两段代码的输出差异本质是plot(*args)内部对args长度做的分支长度 1 时走「Y only」路径长度 2 且都是序列时走「X, Y」路径。理解这点之后就不会在只想画一条曲线时误传两组数导致点对不上。参数说明上要留意plt.show()在脚本模式下会阻塞直到关闭窗口在 Jupyter 里则由后端接管渲染。如果是在无图形界面的服务器上跑需要先切到非交互后端常见做法是import matplotlib matplotlib.use(Agg) # 必须在 import pyplot 之前设置 import matplotlib.pyplot as plt plt.plot([1, 2, 3]) plt.savefig(line.png, dpi150)matplotlib.use(Agg)的作用是禁用交互式显示、只保留文件输出能力dpi150控制输出分辨率。顺序很关键——use()写在import pyplot之后就基本失效了这是新手最常踩的一个坑。2.2 线型颜色字符串与 axis 范围控制matlab 风格的格式字符串是 matplotlib 最省事的参数写法一个字符串同时描述颜色和线型/标记。这套格式串由三部分组成颜色字母、线型符号、标记符号顺序可以任意组合。格式串颜色线型/标记含义b-b 蓝色- 实线默认样式蓝色实线ror 红色o 圆点红色圆点不连线r--r 红色-- 虚线红色虚线bsb 蓝色s 方块蓝色方块标记g^g 绿色^ 上三角绿色三角标记kk 黑色无默认实线黑色plt.plot([1, 2, 3, 4], [1, 4, 9, 16], ro) plt.axis([0, 6, 0, 20]) # [xmin, xmax, ymin, ymax] plt.show()plt.axis([0, 6, 0, 20])的参数是四元列表顺序固定为[xmin, xmax, ymin, ymax]写反了会得到一个看起来「数据被裁掉一半」的图。如果希望不显式给数值而是由数据自动撑开边距可以用plt.axis(tight)。提示格式串里颜色和线型位置可交换ro和or等价但r-o这种带连字符的写法只适用于关键字参数格式串里不需要连字符。3. 同图多曲线与 setp 批量设置线条属性3.1 numpy 数组构造与一次 plot 画多条线参照笔记里用np.arange生成等间距序列这是 matplotlib 生态里最常见的输入构造方式比手写列表更适合做函数曲线。import numpy as np import matplotlib.pyplot as plt t np.arange(0., 5., 0.2) # 起点 0终点 5不含步长 0.2 # 一次传入三组 (x, y, 格式串)在同一坐标系里画三条线 plt.plot(t, t, r--, # 红色虚线y t t, t**2, bs, # 蓝色方块y t^2 t, t**3, g^) # 绿色三角y t^3 plt.show()np.arange(0., 5., 0.2)的三个参数是start, stop, step注意stop是开区间所以序列最后是 4.8 而不是 5.0。用浮点步长时会有累积误差对精度敏感的场景改用np.linspace(0, 5, 25)更稳妥后者的第二个参数是点数而非步长——这两个函数的参数语义差别是面试和实际编码里都常考的点。plot支持变长参数每三个一组x, y, fmt会被识别为一条独立曲线这是 datadriven 写法比循环调用plot少写很多样板代码。3.2 setp 的两种调用形式与属性对照当需要对已绘制线条统一改样式时plt.setp比在plot里塞参数更灵活尤其适合画完之后再调整的场景。lines plt.plot(t, t, t, t**2) # 返回 Line2D 列表 # 形式一关键字参数推荐可读性好 plt.setp(lines, colorr, linewidth2.0) # 形式二matlab 风格的值对 plt.setp(lines, color, r, linewidth, 2.0)两种写法等价底层都是把属性名和值配对后逐个set_*。关键字形式在编辑器里有补全提示出错概率低值对形式在从 matlab 代码翻译过来时更顺手。常用线属性对照表属性名类型说明color字符串/十六进制线条颜色如r、#ff8800linewidth浮点数线宽单位磅论文图常用 1.52.0linestyle字符串-、--、-.、:marker字符串标记符号如o、s、^markersize浮点数标记大小alpha01透明度叠图时常用注意plt.setp作用于传入的对象列表如果忘记接住plot的返回值就只能用plt.gca().get_lines()再去拿代码可读性会差很多。4. subplot 子图布局与多 Figure 的切换逻辑4.1 subplot 编号规则与当前轴概念subplot的三位数字参数是最容易被记混的地方subplot(211)不是「第 211 个图」而是「2 行 1 列布局中的第 1 个子图」。import numpy as np import matplotlib.pyplot as plt def f(t): return np.exp(-t) * np.cos(2 * np.pi * t) t1 np.arange(0.0, 5.0, 0.1) # 粗采样用于标记点 t2 np.arange(0.0, 5.0, 0.02) # 细采样用于连续曲线 plt.figure(1) plt.subplot(211) # 2 行 1 列第 1 个子图上 plt.plot(t1, f(t1), bo, t2, f(t2), k) plt.subplot(212) # 2 行 1 列第 2 个子图下 plt.plot(t2, np.cos(2 * np.pi * t2), r--) plt.show()这段代码里有个值得注意的对比t1步长 0.1 配bo用圆点标出采样位置t2步长 0.02 配k用黑色实线画出光滑曲线。两条线叠在同一子图里一眼能看出采样密度对曲线形状的影响这是教学和论文里很实用的表现手法。编号规则可以这样记subplot(m, n, p)表示把画布切成 m 行 n 列p是从左上角开始按行计数的序号从 1 开始。三位数写法subplot(211)只是subplot(2, 1, 1)的缩写当某个数超过 9 时缩写形式会歧义必须写完整参数。如果子图间隔太大或标签被裁用plt.tight_layout()自动调整比手动算subplots_adjust省事。4.2 figure 切换与「当前轴」的隐式状态matplotlib 的 pyplot 接口维护着一个「当前 figure 当前 subplot」的隐式状态所有plot、title、xlabel都作用在这个当前轴上。理解这点才能看懂下面这段看似跳跃的代码。plt.figure(1) # 创建并切换到 figure 1 plt.subplot(211) # figure 1 的第一个子图 plt.plot([1, 2, 3]) plt.subplot(212) # figure 1 的第二个子图 plt.plot([4, 5, 6]) plt.figure(2) # 切换到 figure 2自动创建一个 subplot(111) plt.plot([4, 5, 6]) plt.figure(1) # 切回 figure 1此时当前轴仍是 subplot(212) plt.subplot(211) # 显式把当前轴设为 subplot(211) plt.title(Easy as 1,2,3) # 这个标题只会落在 subplot(211) 上 plt.show()关键在倒数第三行的注释切回figure(1)时matplotlib 记住的是这个 figure 上次活动的轴212所以必须先subplot(211)把当前轴切过去title才会落到上面的子图。忘了这一步标题就会莫名其妙出现在下半张图上——这是大批量出图脚本里最常见的错位来源。提示对象式接口可以彻底避开这种隐式状态。fig, axes plt.subplots(2, 1)之后用axes[0].plot(...)、axes[0].set_title(...)每个轴的归属一目了然写复杂图表时更推荐。5. 直方图文本标注、LaTeX 公式与网格控制5.1 hist 返回值与 text 定位参照笔记最后一段用了随机数直方图来演示文本标注这个例子把hist、text、axis、grid串在了一起信息密度很高。import numpy as np import matplotlib.pyplot as plt mu, sigma 100, 15 x mu sigma * np.random.randn(10000) # 返回三元组每个柱的高度、柱边界、柱的 Patch 对象列表 n, bins, patches plt.hist(x, 50, normed1, facecolorg, alpha0.75) plt.xlabel(Smarts) plt.ylabel(Probability) plt.title(Histogram of IQ) plt.text(60, .025, r$\mu100,\ \sigma15$) # 在 (60, 0.025) 处写数学公式 plt.axis([40, 160, 0, 0.03]) plt.grid(True) plt.show()hist的第二个参数50是分箱数量facecolorg设定柱色alpha0.75给半透明避免柱叠柱时糊成一片。重点说normed1它让直方图按概率密度归一化纵轴变成密度而不是频数这样才能和理论正态密度曲线叠在同一坐标系里比较。新版 matplotlib 已经把这个参数改名为density跑老代码时若看到弃用警告改成densityTrue即可。plt.text(60, .025, ...)的前两个参数是数据坐标下的位置坐标值要根据axis范围来选放在密度曲线峰值的右侧偏上位置通常不会压住柱体。grid(True)打开网格axis([40,160,0,0.03])把视野锁在感兴趣区间。5.2 r 字符串与 LaTeX 数学公式渲染plt.text里的r$\mu100,\ \sigma15$有两层含义前缀r表示 raw string反斜杠不转义$...$之间的内容交给 mathtext 引擎按 LaTeX 语法渲染。# 常用数学符号写法 r$\alpha$ # 希腊字母 r$\frac{a}{b}$ # 分式 r$\sum_{i1}^{n} x_i$ # 求和下标用 _上标用 ^ r$\sqrt{x^2 y^2}$ # 根号 r$\hat{y} \theta_0 \theta_1 x$ # 线性回归式子matplotlib 内置的 mathtext 覆盖了绝大部分常用符号不需要本地装完整 LaTeX 环境就能出公式。如果确实需要 mathtext 不支持的复杂排版比如多行对齐的align环境再配置外部 LaTeX设置rcParams[text.usetex] True前提是系统里装了 LaTeX 发行版和 dvipng。一个常见的失败场景是公式里混了中文$\mu100\ 均值$会报错或渲染成方框因为数学模式默认字体不含中文字形。解决办法是把中文放到数学模式外面用字符串拼接plt.text(60, .025, r$\mu100$ 均值)这样中文字符走普通文本渲染路径数学部分走 mathtext互不干扰。同理如果整个图的坐标轴标签要显示中文需要单独设置字体属于 matplotlib 中文显示的独立话题和公式渲染是两套机制。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价