Matplotlib 3.1 新功能(2019 年 5 月 18 日)#

有关自上次修订以来的所有问题和拉取请求的列表,请参阅 3.10.0 (2024 年 12 月 13 日) 的 GitHub 统计数据

新功能#

ConciseDateFormatter#

默认使用的自动日期格式器可能非常冗长。可以访问一个新的格式器,该格式器尝试使刻度标签适当简洁。

(源代码, 2x.png, png)

辅助 x/y 轴支持#

一种新的方法可以通过 Axes.secondary_xaxisAxes.secondary_yaxis 为现有坐标轴添加第二个坐标轴。请参阅 辅助轴 获取示例。

(源代码, 2x.png, png)

用于任意坐标轴刻度的 FuncScale#

添加了一个新的 FuncScale 类(以及 FuncTransform),允许用户拥有任意的刻度变换,而无需编写 ScaleBase 的新子类。可以通过以下方式访问:

ax.set_yscale('function', functions=(forward, inverse))

其中 forwardinverse 是可调用对象,返回刻度变换及其逆变换。请参阅 刻度 中的最后一个示例。

散点图的图例#

引入了一种为散点图创建图例的新方法。以前,为了获得 scatter() 图的图例,可以绘制几个散点图,每个散点图都有一个单独的标签,或者手动创建代理艺术家以在图例中显示。现在,PathCollection 提供了一个方法 legend_elements(),以自动方式获取散点图的句柄和标签。这使得为散点图创建图例像下面这样简单:

(源代码, 2x.png, png)

可以在 自动创建图例 中找到一个示例。

Matplotlib 不再需要在 MacOSX 后端上构建框架应用程序#

以前的 Matplotlib 版本需要 Python 的框架构建才能工作。应用程序类型已更新为不再需要此功能,因此 MacOSX 后端应该可以使用非框架 Python。

这也增加了对 PyPy3 的 MacOSX 后端的支持。

图表、FigureCanvas 和后端#

Figure.frameon 现在是图表补丁可见性状态的直接代理#

访问 Figure.frameon(包括通过 get_frameonset_frameon)现在直接转发到底层 Rectangle 艺术家的可见性(Figure.patch.get_frameonFigure.patch.set_frameon)。

添加到 savefig 的 pil_kwargs 参数#

Matplotlib 使用 Pillow 处理保存为 JPEG 和 TIFF 格式。 savefig() 函数增加了一个 pil_kwargs 关键字参数,该参数可用于将参数转发到 Pillow 的 PIL.Image.Image.save

将文件保存为 PNG 格式时,也可以使用 pil_kwargs 参数。在这种情况下,Matplotlib 也使用 Pillow 的 PIL.Image.Image.save,而不是通过其内置的 PNG 支持。

inaxes 方法添加到 FigureCanvasBase#

FigureCanvasBase 类现在有一个 inaxes 方法,用于检查某个点是否在坐标轴中,并返回最顶层的坐标轴,否则返回 None。

cairo 后端默认使用 pycairo 而不是 cairocffi#

这在某些情况下可以提高导入/运行时性能。如果 pycairo 不可用,后端将回退到 cairocffi。

坐标轴和艺术家#

axes_grid1 和 axisartist 坐标轴不再绘制两次 spines#

以前,axes_grid1axisartist 坐标轴的 spines 会绘制两次,导致出现“粗体”外观。现在不再是这种情况了。

更改了 ArtistInspector.get_aliases 的返回类型#

ArtistInspector.get_aliases 之前将别名集作为 {fullname: {alias1: None, alias2: None, ...}} 返回。dict-to-None 映射用于在早期版本的 Python 中模拟集合。现在它已被集合取代,即 {fullname: {alias1, alias2, ...}}

此值也存储在 ArtistInspector.aliasd 中,该值也同样发生了更改。

ConnectionPatch 接受任意变换#

除了像 "data""axes fraction" 这样的字符串之外,ConnectionPatch 现在接受任何 Transform 作为 coordsAcoordsB 参数的输入。这允许在不同用户定义的坐标系中定义的点之间绘制线条。另请参阅 使用 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() 的匹配参数相同。下面的图显示了这对输出的影响。

(源代码, 2x.png, png)

轴和刻度#

新增 Axis.get_invertedAxis.set_inverted#

Axis.get_invertedAxis.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 方法)。

动画和交互#

支持鼠标前进/后退按钮#

图形管理器现在支持鼠标按钮的 button_press 事件,类似于 key_press 事件。这允许将动作绑定到鼠标按钮(请参阅 MouseButton)。此机制的第一个应用是在使用 Qt5 后端创建的图形中支持鼠标前进/后退按钮。

progress_callback 参数到 save()#

方法 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 的图像,状态栏现在(使用默认设置)将值显示为 1000010001,而先前两个值都显示为 1e+04

MouseEvent 按钮属性现在是一个 IntEnum#

MouseEvent 实例的 button 属性可以取值 None、1(左键)、2(中键)、3(右键)、“up”(滚动)和“down”(滚动)。为了提高可读性,值 1、2 和 3 现在使用 enum.IntEnummatplotlib.backend_bases.MouseButton 表示,其中值 MouseButton.LEFT (== 1)、MouseButton.MIDDLE (== 2) 和 MouseButton.RIGHT (== 3)。

配置、安装和开发#

MATPLOTLIBRC 环境变量现在可以指向任何“文件”路径#

这包括设备文件;特别是,在 Unix 系统上,可以将 MATPLOTLIBRC 设置为 /dev/null 以忽略用户的 matplotlibrc 文件,并回退到 Matplotlib 的默认设置。

提醒一下,如果 MATPLOTLIBRC 指向一个目录,Matplotlib 将尝试从 $MATPLOTLIBRC/matplotlibrc 加载 matplotlibrc 文件。

允许在 MATPLOTLIBRC 文件中使用 LaTeX 代码 pgf.preambletext.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 来显示更详细(或更少)的日志输出。