Matplotlib 3.1 新特性(2019 年 5 月 18 日)#
有关自上次修订以来的所有问题和拉取请求列表,请参阅 GitHub 3.11.0 版本统计信息 (2026年6月11日)。
新功能#
ConciseDateFormatter#
默认使用的自动日期格式化程序可能非常冗长。现提供一个新的格式化程序,旨在使刻度标签更加简洁。
支持次要 x/y 轴#
通过 Axes.secondary_xaxis 和 Axes.secondary_yaxis,提供了一种向现有坐标轴添加次要轴的新方法。参见 次要坐标轴 获取示例。
FuncScale 用于任意轴缩放#
新增了一个 FuncScale 类(以及 FuncTransform),允许用户进行任意的缩放变换,而无需编写 ScaleBase 的新子类。可以通过以下方式访问:
ax.set_yscale('function', functions=(forward, inverse))
其中 forward 和 inverse 是返回缩放变换及其逆变换的可调用对象。请参阅 缩放概述 中的最后一个示例。
散点图图例#
引入了一种为散点图创建图例的新方法。以前,为了获得 scatter() 图的图例,用户必须绘制多个散点图(每个带有一个单独的标签),或者手动创建代理 artists 以显示在图例中。现在,PathCollection 提供了一个方法 legend_elements(),可以自动获取散点图的句柄和标签。这使得创建散点图图例变得非常简单:
示例可在 自动创建图例 中找到。
Matplotlib 不再要求 MacOSX 后端使用 framework app 构建#
以前版本的 matplotlib 需要 python 的 Framework 构建才能工作。应用程序类型已更新,不再需要此要求,因此 MacOSX 后端现在应能与非 framework 版本的 python 一起使用。
这也为 PyPy3 增加了对 MacOSX 后端的支持。
Figure、FigureCanvas 和后端#
Figure.frameon 现在直接代理 Figure patch 的可见性状态#
访问 Figure.frameon(包括通过 get_frameon 和 set_frameon)现在会直接转发到底层 Rectangle artist 的可见性状态(Figure.patch.get_frameon, Figure.patch.set_frameon)。
pil_kwargs 参数添加到 savefig#
Matplotlib 使用 Pillow 处理 JPEG 和 TIFF 格式的保存。savefig() 函数增加了一个 pil_kwargs 关键字参数,可用于将参数转发给 Pillow 的 PIL.Image.Image.save。
pil_kwargs 参数也可用于保存为 PNG。在这种情况下,Matplotlib 也会使用 Pillow 的 PIL.Image.Image.save,而不是通过其内置的 PNG 支持。
为 FigureCanvasBase 添加 inaxes 方法#
FigureCanvasBase 类现在有一个 inaxes 方法,用于检查一个点是否位于坐标轴内,返回最顶层的轴,否则返回 None。
cairo 后端默认使用 pycairo 而非 cairocffi#
这在某些情况下可加快导入/运行速度。如果 pycairo 不可用,后端将回退到 cairocffi。
Axes 和 Artists#
axes_grid1 和 axisartist Axes 不再重复绘制脊线#
以前,axes_grid1 和 axisartist Axes 的脊线会被绘制两次,导致外观显得“加粗”。现在不再是这种情况。
ArtistInspector.get_aliases 的返回类型已更改#
ArtistInspector.get_aliases 之前返回的别名集格式为 {fullname: {alias1: None, alias2: None, ...}}。在早期 Python 版本中,使用字典到 None 的映射来模拟集合。现在它已被集合替换,即 {fullname: {alias1, alias2, ...}}。
该值也存储在 ArtistInspector.aliasd 中,该属性也进行了相应更改。
ConnectionPatch 接受任意变换#
除了字符串如 "data" 或 "axes fraction" 外,ConnectionPatch 现在接受任何 Transform 作为 coordsA 和 coordsB 参数的输入。这允许在定义于不同用户坐标系中的点之间绘制连线。另请参阅 使用 ConnectionPatch。
mplot3d Line3D 现在允许 {set,get}_data_3d#
在 mplot3d 中使用 3D 投影创建的线条现在可以通过 get_data_3d() 访问数据,该方法返回一个包含 (x, y, z) 数据的元组。相应的 set_data_3d 可用于修改现有 Line3D 的数据。
Axes3D.voxels 现在对生成的体素进行阴影处理#
Axes3D.voxels 方法现在接受一个 shade 参数,默认为 True。它根据面的方向对其进行阴影处理,行为与 plot_trisurf() 和 bar3d() 的匹配参数一致。下方的图显示了这对输出的影响。
Axis 和 Ticks#
新增 Axis.get_inverted 和 Axis.set_inverted#
Axis.get_inverted 和 Axis.set_inverted 方法用于查询和设置轴是否使用“反转”方向(例如,x 轴向左递增,y 轴向下递增)。
它们执行的任务类似于 Axes.xaxis_inverted、Axes.yaxis_inverted、Axes.invert_xaxis 和 Axes.invert_yaxis,不同之处在于 Axis.set_inverted 使得无论轴之前是否已反转,都可以更容易地设置其反转状态。
调整默认次刻度间距#
对于间距为 2.5 个单位的主刻度,默认的次刻度间距从 0.625 更改为 0.5。
EngFormatter 现在接受 usetex 和 useMathText 作为仅限关键字参数#
EngFormatter 添加了公共 API 以控制刻度标签中数字的渲染方式。默认情况下,useMathText 的取值为 rcParams["axes.formatter.use_mathtext"](默认:False),usetex 的取值为 rcParams["text.usetex"](默认:False)。
如果其中任何一个为 True,则数字将被 $ 符号包围。当使用 TeX 时,这意味着数字将以 TeX 的数学字体显示。当使用 mathtext 时,数字周围的 $ 符号将确保 Unicode 渲染(正如 mathtext 所暗示的那样)。这确保了在使用 mathtext 时,刻度中的负号被渲染为 Unicode 减号 (U+2212)(无需依赖 fix_minus 方法)。
动画和交互性#
为 save() 添加 progress_callback 参数#
Animation.save 方法增加了一个可选的 progress_callback 参数,用于通知保存进度。
为 animation.FuncAnimation 添加 cache_frame_data 仅限关键字参数#
matplotlib.animation.FuncAnimation 默认一直缓存帧数据;然而,这种缓存并不适用于所有情况,例如当 FuncAnimation 只需要进行交互式绘制(而不是保存),且帧数据所需的内存非常大时。通过添加 cache_frame_data 仅限关键字参数,用户现在可以禁用此缓存;因此,此新参数修复了问题 #8528。
使用 PillowWriter 实现无尽循环 GIF#
我们了解到大多数人希望不止一次地观看 GIF。使用 PillowWriter 将动画保存为 GIF 现在会产生一个无尽循环的 GIF。
调整 matplotlib.widgets.Slider 以支持垂直方向#
matplotlib.widgets.Slider 小部件现在接受一个可选参数 orientation,它指示滑动条应采取的方向('horizontal' 或 'vertical')。
改进了存在色标时,光标下图像值的格式化#
当存在色标时,现在会使用其格式化程序来格式化状态栏中鼠标光标下的图像值。例如,对于显示值 10,000 和 10,001 的图像,状态栏现在将(使用默认设置)显示为 10000 和 10001,而此前两个值都显示为 1e+04。
配置、安装和开发#
MATPLOTLIBRC 环境变量现在可以指向任何“文件”路径#
这包括设备文件;特别是在 Unix 系统上,可以将 MATPLOTLIBRC 设置为 /dev/null 以忽略用户的 matplotlibrc 文件并回退到 Matplotlib 的默认值。
提醒一下,如果 MATPLOTLIBRC 指向一个目录,Matplotlib 将尝试从 $MATPLOTLIBRC/matplotlibrc 加载 matplotlibrc 文件。
允许在 MATPLOTLIBRC 文件中使用 LaTeX 代码 pgf.preamble 和 text.latex.preamble#
以前,rc 文件键 rcParams["pgf.preamble"](默认:'')和 rcParams["text.latex.preamble"](默认:'')是使用逗号作为分隔符进行解析的。这会破坏有效的 LaTeX 代码,例如:
\usepackage[protrusion=true, expansion=false]{microtype}
解析方式已修改,现在将整行传递给 LaTeX 系统,保留所有逗号。在 Python 脚本中传递字符串列表仍能按旧方式工作。
新的日志记录 API#
matplotlib.set_loglevel / pyplot.set_loglevel 可以被调用以显示更多(或更少)的详细日志输出。