第 4 章 · Matplotlib 高级主题 章节摘要:前三章我们一直在用 Matplotlib 的成品接口画图,plot、scatter、bar 一条龙下来,图是画出来了,但每当你想要再往里抠一点——让某行文字永远贴在子图右上角、让一个多边形精确对齐到某个数据点、或者搞懂为什么改了透明度图没变化——就会撞上一堵看不见的墙。这堵墙就是 Matplotlib 的对象模型。本章拆掉这堵墙,先讲三件底层的事:Artist 对象模型(所有可见元素的统一基类与层级)、坐标变换(数据坐标怎么一步步变成屏幕像素)、Path 和 Patch(底层图形到底由什么拼出来)。
章节摘要:前三章我们一直在用 Matplotlib 的成品接口画图,plot、scatter、bar 一条龙下来,图是画出来了,但每当你想要再往里抠一点——让某行文字永远贴在子图右上角、让一个多边形精确对齐到某个数据点、或者搞懂为什么改了透明度图没变化——就会撞上一堵看不见的墙。这堵墙就是 Matplotlib 的对象模型。本章拆掉这堵墙,先讲三件底层的事:Artist 对象模型(所有可见元素的统一基类与层级)、坐标变换(数据坐标怎么一步步变成屏幕像素)、Path 和 Patch(底层图形到底由什么拼出来)。在此基础上,再补三件工程上的事:文本渲染与字体(中文显示、字体选择怎么处理)、扩展与生态(Seaborn、Cartopy 这些库怎么建立在 Matplotlib 之上)、性能优化(大规模数据怎么画才不卡)。读完这一章,你不再只是会画图,而是知道图是怎么被画出来的、怎么画得更好更快。
阅读完本章,你应当能够:
画图的一瞬间,Matplotlib 在背后做了三件事:把对象挂到树上、把坐标换算成像素、把路径填上颜色。看懂这三件事,你就看懂了 Matplotlib。而文本、生态、性能,则是把这套底层能力用对、用好、用快。
本章六节分成两组:4.1 到 4.3 是底层三件事,回答"一张图是怎么被画出来的";4.4 到 4.6 是工程三件事,回答"怎么把图里的文字处理好、怎么借力生态、怎么画得快"。前者是后者的地基,后者是前者的落地。
| 切面 | 回答的问题 | 典型场景 |
|---|---|---|
| Artist 对象模型 | 画布上有哪些可见元素、谁包含谁 | 改属性、隐藏元素、自定义渲染 |
| 坐标变换 | 一个数据点落在像素的哪个位置 | 注解定位、叠加图层、自定义轴 |
| Path 与 Patch | 一个形状由哪些顶点和指令拼成 | 自绘图形、自定义标记、填充区域 |
| 文本渲染与字体 | 文字怎么显示、中文字体怎么配 | 中文标签、数学公式、特殊字符 |
| 扩展与生态 | 哪些库建立在 Matplotlib 之上 | 统计图、地图、金融图 |
| 性能优化 | 大规模数据怎么画才不卡 | 百万点散点、长时序线图 |
把底层三件事想成一台打印机的内部:Artist 是打印任务里列出的每个零件,坐标变换是决定每个零件印在纸上的哪个位置,Path 和 Patch 是每个零件实际印出来的墨迹。而工程三件事,则是给这台打印机配好纸和墨(文本字体)、接入更多打印模板(扩展生态)、并让它别在大任务前卡壳(性能优化)。
从"一切皆为 Artist"这句话出发,先带你看清 Figure、Axes、Axis、Line2D、Text 这些对象的父子关系,再动手拿到对象改属性,最后简谈自定义 Artist 的门槛。
数据坐标怎么一步步变成屏幕像素,四套坐标系各管什么,Affine2D 的平移、缩放、旋转怎么用,组合变换的顺序又有什么讲究。
图形的最底层是什么:顶点加代码拼出 Path 骨架,再包一层填充和描边变成 Patch。掌握它,你就能画出任何内置函数画不出的形状。
文字是图里最容易被忽视、也最容易翻车的一块。这一节讲清中文字体怎么配、mathtext 能做什么不能做什么,以及特殊字符怎么处理。
Seaborn、Cartopy、mplfinance 这些库都站在 Matplotlib 的肩膀上。这一节讲清它们各自补了什么能力,以及什么时候该直接用 Matplotlib、什么时候该借力它们。
几百万个点的散点图怎么不卡、超长时序线怎么画得动。这一节讲降采样、位图渲染、路径简化这些策略,以及它们各自的代价。
一句话概括:4.1 认识对象,4.2 定位对象,4.3 捏造对象——这是看懂一张图的三件底层事;4.4 管文字、4.5 借生态、4.6 提速度——这是把图画对、画好、画快的三件工程事。
4.1 Artist 对象模型(画布上有什么) │ 对象与层级 ▼ 4.2 坐标变换(对象放在哪) │ 定位与换算 ▼ 4.3 Path 与 Patch(对象长什么样) │ 底层三件事 → 地基 ▼ 4.4 文本渲染与字体(文字怎么显示) 4.5 扩展与生态(怎么借力) 4.6 性能优化(怎么画快)
4.1 是地基:你得先知道一个 Figure 里装着 Axes、Axes 里装着 Line2D 和 Text,后面几节才有操作的对象。4.2 补上"位置"这一维,4.3 落到最底层。这三节由表及里,从"改别人画好的"一路走到"自己造别人画不出的"。4.4 到 4.6 则在这套底层之上解决真实工程问题:文字是每个图都要面对的细节,生态是站在巨人肩膀上省力,性能是大数据场景下绕不开的约束。
💡 读本章的心法:抓住"图层"这个类比。Figure 是一块画布,Axes 是画布上的一块绘图区,Line2D、Text、Patch 是贴在绘图区上的一层层透明薄膜。改属性是调整某一层薄膜,坐标变换是决定这层薄膜贴在哪个位置,Path 和 Patch 是这层薄膜上到底印了什么图案。图层想通了,全章就通了。
⚠️ 本章最大的坑:把"能画出来"当成"懂了"。这一章的代码都很短,跑通不等于理解。尤其是坐标变换的组合顺序和 Path 的顶点代码配对,不亲手改几个参数、故意制造一次错位,你很难真正记住它们的脾气。