1.1 Matplotlib 简介与安装 本节摘要:Matplotlib 是 Python 生态里最基础、最通用的数据可视化库,它把"数据"变成"图"这件事做成了一套可编程的对象体系——你写代码描述要画什么,它负责把像素渲染出来。它最初的接口模仿 MATLAB 的绘图习惯,但本质是 Python 原生的库,几乎所有更高级的可视化工具都建立在它之上。本节先讲清它是什么、和 MATLAB、Excel、Seaborn 这些工具是什么关系,再说明"安装"到底做了什么,最后用一段最短的代码确认环境已经就绪,为后面动手画图铺路。
本节摘要:Matplotlib 是 Python 生态里最基础、最通用的数据可视化库,它把"数据"变成"图"这件事做成了一套可编程的对象体系——你写代码描述要画什么,它负责把像素渲染出来。它最初的接口模仿 MATLAB 的绘图习惯,但本质是 Python 原生的库,几乎所有更高级的可视化工具都建立在它之上。本节先讲清它是什么、和 MATLAB、Excel、Seaborn 这些工具是什么关系,再说明"安装"到底做了什么,最后用一段最短的代码确认环境已经就绪,为后面动手画图铺路。
阅读完本节,你应当能够:
先别急着背名词。想象你有一张坐标纸,想在横轴标上时间、纵轴标上温度,然后把每天的气温点连成一条线。用手画,你得量刻度、描点、连线,改一个数据就得擦掉重来。Matplotlib 做的事,就是把这套"手工画图"的动作变成代码:你告诉它数据在哪、用哪种图形、怎么标注,它负责计算坐标、渲染像素、把图呈现在屏幕上或存进文件。
这个定义落到一句话上:Matplotlib 是一个 Python 绘图库,你把数据和一个"怎么画"的描述交给它,它输出一张图。
它最早是 John Hunter 在 2003 年发布的,目标很明确——给 Python 用户一个媲美 MATLAB 绘图能力的工具,让做科学计算的人不必为了画张图再切到 MATLAB 里去。所以它早期的接口风格和 MATLAB 很像:一个命令画一条线,一个命令设标题,用得顺手的人会觉得亲切。但它骨子里是 Python 的东西,和 NumPy、Pandas 天然搭,这点在后面会反复体现。
Matplotlib 能画的图非常杂:折线、散点、柱状、直方图、饼图、箱线图、等高线、热力图、甚至三维图。但这一节我们不急着把所有类型都列出来——那会变成一张没重点的清单。真正要记住的是它"能画什么"背后的那句话:只要你能把数据放进坐标系里,它几乎都能表达。
新手上路,最容易困惑的不是 Matplotlib 本身,而是"这么多画图工具,我到底该用哪个"。Excel 能画、MATLAB 能画、Seaborn 也能画,它们和 Matplotlib 到底什么关系?把这个问题想清楚,你就知道 Matplotlib 的位置了。
先说 MATLAB。它是一整个数值计算环境,画图只是它的一部分功能,而且是闭源、要授权的。Matplotlib 从它那里借了接口的"手感",但只做画图这一件事,而且是开源免费的。如果你的工作流已经在 Python 里(数据用 NumPy 算、用 Pandas 整理),再用 MATLAB 画图就得多切一道环境,Matplotlib 让你在同一个脚本里从数据一路做到图。
再说 Excel。它画图是"点鼠标",适合做几张临时的、不改的报表图,但一旦要自动生成、要批量出图、要把画图嵌进数据分析流程,点鼠标就成了瓶颈。Matplotlib 是"写代码",初期上手比点鼠标慢,但换来的是可复现、可自动化、可精细到每一个像素的控制。用哪个,看你要不要"批量"和"精确"。
Seaborn 是最容易和 Matplotlib 混的一个。它其实建立在 Matplotlib 之上,是一层更高级的封装:Matplotlib 给你画笔,Seaborn 给你现成的"统计图模板",默认样式也更现代。你写一行 Seaborn 画一张带置信区间的回归图,底层还是 Matplotlib 在渲染。所以这两者不是二选一的竞争关系,而是"底层"和"上层"的分工——这也是为什么学 Matplotlib 的人,后面用 Seaborn 会特别顺。
| 工具 | 本质 | 画图方式 | 什么时候选它 |
|---|---|---|---|
| Excel | 电子表格软件 | 点鼠标选数据出图 | 少量、一次性、不要求自动化 |
| MATLAB | 闭源数值计算环境 | 命令式,接口风格类似 | 已有 MATLAB 工作流且不介意授权 |
| Seaborn | Matplotlib 之上的统计图封装 | 高级 API,模板化 | 快速出漂亮的统计图 |
| Matplotlib | Python 原生绘图库 | 代码精确控制每个元素 | 需要可复现、可自动化、精细控制 |
💡 关键直觉:选工具看的不是"谁更强",而是"你的数据已经在哪、你要不要自动化"。数据已经在 Python 里、又要反复改反复出图,Matplotlib 几乎总是对的那张底牌。
把 Matplotlib 放进一条完整的数据可视化流水线里看,它的位置会更清楚。通常一条流水线长这样:先准备数据(读文件、算指标、清洗),再决定"用什么图形表达这个数据",然后才是实际画图,接着做样式调整,最后输出成图片或交互界面。Matplotlib 站的是中间偏后的那几环。
看这张图有个要点:Matplotlib 不负责"准备数据"。它假定你交给它的数据已经是干净的、能放进坐标系的数值。数据清洗是 NumPy、Pandas 的活(第 3 章会专门讲怎么配合)。Matplotlib 的职责从"选择图形"开始,一直延伸到"输出"结束——这正是它"专注做画图这一件事"的体现。
也正因为它在流水线里站得靠后,它必须能接住各种来源的数据:列表、NumPy 数组、Pandas 的 DataFrame,甚至直接一个函数算出来的序列。这个"来者不拒"的输入接口,是它能和整个 Python 数据生态咬合的关键。
"装 Matplotlib"听起来像一句口令,其实拆开是几件具体的事。理解这几件事,比背下某个安装命令有用得多——命令会变,机理不变。
第一件,把库的代码文件放进你的 Python 能找得到的地方。Python 有一套自己的"模块搜索路径",安装器做的事,就是把这个库的代码下载下来,放到那些路径里,这样你写 import matplotlib 时,解释器才知道去哪个文件夹找。
第二件,处理依赖。Matplotlib 不是孤零零一个包,它要借助 NumPy 做数值计算、借助 Pillow 处理图像、借助字体引擎渲染文字。安装器会把这些"帮手"一并装好,或确认它们已经在环境里。缺了任何一个,导入时都会报错。
第三件,可能还要装一个"渲染后端"。Matplotlib 能把图画到屏幕上(交互窗口),也能在没有任何屏幕的服务器上把图直接存成文件。后者靠的就是一个叫"后端"的机制,环境不同,需要的后端不同。这也是为什么有的服务器上"图显示不出来"但其实"图能存下来"——它缺的是显示用的后端,而不是画图能力本身。
⚠️ 常见坑:安装成功 ≠ 在任何地方都能用。很多人装好了,在某个编辑器里一跑就报"找不到模块",往往是因为装进了一个 Python 环境,跑的却是另一个。确认"你在哪个环境里装、又在哪个环境里跑",比反复重装更重要。
💡 关键直觉:把"安装"想成"把工具和它的零件搬进你正在用的那个工具箱",而不是一个玄学开关。装错工具箱(环境),工具再好也拿不到。
装完之后,最实在的验证不是看某个版本号,而是真画一张图出来。下面这段代码是所有后续内容的起点,它同时完成了三件事:确认库能导入、确认能建图、确认能把数据画出来。
import matplotlib.pyplot as plt x = [1, 2, 3, 4, 5] y = [2, 4, 1, 3, 5] fig, ax = plt.subplots() # 建一张画布和一个坐标系 ax.plot(x, y) # 把 x、y 连成一条折线 ax.set_title("第一张图") plt.show() # 在屏幕上显示
这段代码里已经埋了本章后面所有内容的地基,值得现在先混个眼熟。plt.subplots() 一次返回两个东西——fig 是画布,ax 是坐标系,这就是 1.2 节要讲的 Figure 和 Axes。ax.plot 是 1.3 节的折线图,set_title 是 1.4 节的参数设置,最后要不要存文件是 1.5 节的事。
如果在没有图形界面的环境里(比如一台远程服务器)跑,plt.show() 可能弹不出窗口。这不代表没装好,只说明这个环境缺"显示"这条通道。你可以换成把图存成文件的思路来验证——那是 1.5 节的内容。现在你只需要记住:图能画出来、能存下来,就算环境就绪了。
Matplotlib 今天的地位不是谁钦定的,而是二十多年一点点长出来的。它诞生于 2003 年,作者 John Hunter 当时在做神经科学研究,需要在 Python 里画图,却找不到趁手的工具,于是自己动手写了一个,目标很朴素——让 Python 的画图能力够得上 MATLAB。
这也是它接口带着浓浓 MATLAB 味的原因。plot、xlabel、title 这些函数名,几乎是把 MATLAB 的绘图命令照搬了过来。这个设计当年很聪明,一大批从 MATLAB 转过来的人几乎零成本上手。但它也埋下了今天最大的困惑:新手看到 plt.plot 和 ax.plot 两套写法,搞不清谁是谁。这个困惑,正是 1.2 节要专门掰开讲的核心。
二十多年过去,Matplotlib 从一个科研圈的小工具,长成了 Python 数据生态里的"基础设施"。它的意义早就超出了"一个库"——它定义了 Python 里"图"的底层标准。Seaborn 在它上面包统计图,Pandas 的绘图功能在它上面薄薄铺了一层,无数论文的插图、无数数据报告的配图,背后渲染的都是它。所以哪怕你以后主要用 Seaborn 或别的上层库,理解 Matplotlib 就等于理解了这些工具共同的底座。
后两者主打交互式图表——鼠标悬停显示数值、缩放、拖拽、联动。Matplotlib 主打静态、可精细控制的图表,虽然也能做一点交互和动画,但不是它的主战场。要交互式仪表盘、探索性看板,选 Plotly 这类更顺手;要论文插图、可复现的静态图、精细到每个像素的控制,选 Matplotlib。两者不是替代关系,是"静态精修"与"交互探索"的分工。
需要,而且更划算。Seaborn 底层就是 Matplotlib,你调 Seaborn 图里的细节——改刻度、加文字、挪图例——最终都要落到 Matplotlib 的对象和参数上。懂了 Matplotlib,Seaborn 对你就不再是黑盒:遇到它默认样式满足不了的需求,你知道该往下钻一层、直接改底层的对象。反过来,只会 Seaborn,遇到边界问题就卡住了。
基本不用背。它的接口名大多"见名知意"——set_xlabel 就是设 x 轴标签,set_title 就是设标题。真正要记的是对象之间的关系(画布、坐标系、元素),以及"想改哪里、就去哪个对象上找参数"的思维。具体参数名,用到时查官方文档就行——那本字典很厚,但你只需要会翻,不需要全背。
fig, ax = plt.subplots() 是后续一切的地基。下一节我们钻进那段验证代码里最关键的一行——
fig和ax到底各是什么,Figure 和 Axes 这两个对象是如何撑起整张图的。