历史#
注意
以下介绍性文字由 Matplotlib 的原作者 John D. Hunter (1968-2012) 于 2008 年撰写。
Matplotlib 是一个用于在 Python 中绘制数组二维图形的库。尽管它起源于对 MATLAB 图形命令的模拟,但它独立于 MATLAB,并能以 Pythonic 且面向对象的方式使用。虽然 Matplotlib 主要使用纯 Python 编写,但它大量使用了 NumPy 和其他扩展代码,以便在面对大型数组时也能提供良好的性能。
Matplotlib 的设计理念是,你应该能够仅用几条甚至一条命令就能创建简单的图形!如果你想看数据的直方图,你不需要去实例化对象、调用方法、设置属性等等;它应该直接就能用。
多年来,我一直专门使用 MATLAB 进行数据分析和可视化。MATLAB 擅长让绘制精美的图形变得简单。当我开始处理脑电图(EEG)数据时,我发现需要编写应用程序来与数据进行交互,并用 MATLAB 开发了一个 EEG 分析应用程序。随着应用程序复杂度的增加(需要与数据库、HTTP 服务器交互,处理复杂的数据结构),我开始感受到 MATLAB 作为一种编程语言的局限性,并决定用 Python 重新开始。Python 绰绰有余地弥补了 MATLAB 作为编程语言的所有缺陷,但我当时却很难找到一个二维绘图包(对于三维绘图,VTK 已经远远超出了我所有的需求)。
当我寻找 Python 绘图包时,我有几个要求:
图形应该看起来非常棒——达到出版级别的质量。对我来说,一个重要的要求是文本看起来要美观(如抗锯齿等)。
支持 Postscript 输出,以便嵌入到 TeX 文档中
可嵌入到图形用户界面中以用于应用程序开发
代码应该足够简单,便于我理解和扩展
绘图应该非常简单
由于找不到适合我的软件包,我做了任何一个有自尊心的 Python 程序员都会做的事:挽起袖子,投入其中。因为我没有任何计算机图形学的实际经验,所以我决定模拟 MATLAB 的绘图功能,因为那是 MATLAB 做得很棒的一点。这还有一个额外的好处:许多人拥有丰富的 MATLAB 经验,从而使他们能够快速上手在 Python 中进行绘图。从开发者的角度来看,拥有一个固定的用户界面(pylab 接口)非常有用,因为可以在不影响用户代码的情况下重新设计代码库的核心部分。
Matplotlib 的代码在概念上分为三个部分:pylab 接口是由 pylab 提供的一组函数,它允许用户使用与 MATLAB 生成图像非常相似的代码来创建图形(Pyplot 教程);Matplotlib 前端或 Matplotlib API 是完成核心工作的一组类,负责创建和管理图形(Figure)、文本、线条、图表等(Artist 教程),这是一个对输出一无所知的抽象接口;后端是与设备相关的绘制设备(又称渲染器),它们将前端的表示转换为硬拷贝或显示设备上的画面(什么是后端?)。后端示例:PS 创建 PostScript® 打印稿,SVG 创建可缩放矢量图形(Scalable Vector Graphics),Agg 使用 Matplotlib 附带的高质量 Anti-Grain Geometry 库创建 PNG 输出,GTK 将 Matplotlib 嵌入到 Gtk+ 应用程序中,GTKAgg 使用 Anti-Grain 渲染器创建图形并将其嵌入到 Gtk+ 应用程序中,对于 PDF、WxWidgets、Tkinter 等也是如此。
Matplotlib 被许多人在许多不同的场景中使用。有些人希望自动生成 PostScript 文件发送给打印机或出版商。另一些人将 Matplotlib 部署在 Web 应用服务器上,生成 PNG 输出以嵌入到动态生成的网页中。还有些人通过 Windows 上 Tkinter 中的 Python shell 交互式地使用 Matplotlib。而我的主要用途是将 Matplotlib 嵌入到一个运行在 Windows、Linux 和 Macintosh OS X 上的 Gtk+ EEG 应用程序中。
Matplotlib 的原始徽标 (2003 -- 2008)。
(源代码)
Matplotlib 徽标 (2008 - 2015)。