2.1.0 中的 API 变更#

对数刻度默认行为改为屏蔽小于等于 0 的值#

调用 matplotlib.axes.Axes.set_xscalematplotlib.axes.Axes.set_yscale 现在默认使用 'mask' 方法来处理无效值(而不是 'clip')。这意味着对数刻度上任何小于等于 0 的值将不会显示。

此前,它们会被裁剪到一个非常小的值并显示出来。

matplotlib.cbook.CallbackRegistry.process() 默认抑制异常#

Matplotlib 使用 CallbackRegistry 实例作为 GUI 用户输入事件和用户回调之间的桥梁。以前,在用户回调中引发的任何异常都会从 process 方法(通常在 GUI 事件循环中)冒出。大多数 GUI 框架只是将回溯打印到屏幕并继续,因为不总是有明确的方法将异常返回给用户。然而,PyQt5 现在在事件循环中收到未处理的 Python 异常时会退出进程。因此,process() 现在默认抑制异常并将其回溯打印到 stderr。

process() 处理异常的方式现在可以通过 exception_handler 属性和关键字参数进行用户配置。要恢复以前的行为,请传递 None

cb = CallbackRegistry(exception_handler=None)

也可以传递一个以 Exception 作为唯一参数的函数

def maybe_reraise(exc):
    if isinstance(exc, RuntimeError):
        pass
    else:
        raise exc

cb = CallbackRegistry(exception_handler=maybe_reraise)

改进了坐标轴网格的切换功能#

现在,g 键绑定可以独立切换 xy 网格的状态(通过循环切换所有四种开/关组合)。

新的 G 键绑定切换次要网格的状态。

如果仅网格线(任一方向)的子集可见,则这两个绑定都会被禁用,以避免对图形进行不可逆的更改。

刻度标签被关闭而非隐藏#

在内部,Tick~matplotlib.axis.Tick.label1On 属性现在用于隐藏刻度标签,而不是设置刻度标签对象的可见性。这提高了整体性能并解决了一些问题。因此,如果这些标签需要显示,则需要使用 tick_params(),例如:

ax.tick_params(labelbottom=True)

移除空图例警告#

pyplot.legend 以前在找不到带标签的艺术家时会发出警告。此警告已被移除。

更精确的图例自动定位#

图例的自动定位现在倾向于使用 Line2D 包围的区域,而不是将图例放置在线本身之上。

清理股票样本数据#

股票样本数据已清理,以消除冗余并提高可移植性。AAPL.dat.gzINTC.dat.gzaapl.csv 文件已完全删除,并且将不再通过 matplotlib.cbook.get_sample_data 提供。如果需要 CSV 文件,建议使用样本数据中继续提供的 msft.csv。如果 NumPy 二进制文件可以接受,建议使用以下两个新文件。aapl.npy.gzgoog.npy 文件已被 aapl.npzgoog.npz 替换,其中第一列的类型已从 datetime.date 更改为 numpy.datetime64,以更好地跨 Python 版本移植。请注意,Matplotlib 尚未完全支持 numpy.datetime64

Qhull 更新至 2015.2#

Matplotlib 随附的 Qhull 版本(用于 Delaunay 三角剖分)已从 2012.1 更新到 2015.2。

改进了带有大偏移的 Delaunay 三角剖分#

Delaunay 三角剖分现在能更好地处理大的 x,y 偏移。这可能导致使用 Matplotlib 计算的任何三角剖分发生微小变化,即任何请求计算 Delaunay 三角剖分的 matplotlib.tri.Triangulation 的使用,包括 matplotlib.pyplot.tricontourmatplotlib.pyplot.tricontourfmatplotlib.pyplot.tripcolormatplotlib.pyplot.triplotmatplotlib.mlab.griddatampl_toolkits.mplot3d.axes3d.Axes3D.plot_trisurf

使用 backports.functools_lru_cache 而非 functools32#

它维护得更好,并且被更广泛地使用(例如 pylint、jaraco 等)。

cbook.is_numlike 仅执行实例检查#

matplotlib.cbook.is_numlike 现在只检查其参数是否是 (numbers.Number, np.Number) 的实例。特别是,这意味着数组现在不再被视为数字类型(num-like)。

椭圆弧现在在正确的角度之间绘制#

matplotlib.patches.Arc 补丁现在在给定角度之间正确绘制。

以前,会先绘制一个圆弧,然后将其拉伸成椭圆,因此生成的弧不在 *theta1* 和 *theta2* 之间。

-d$backend 不再设置后端#

不再可能通过在命令行传递 -d$backend 来设置后端。请改用 MPLBACKEND 环境变量。

Path.intersects_bbox 始终将边界框视为已填充#

此前,当调用 Path.intersects_bboxfilled 设置为 False 时,它会将路径和边界框都视为未填充。此行为未得到充分文档说明,并且通常不是所需行为,因为边界框用于表示位于边界框内部的更复杂的形状。此行为现已更改:当 filledFalse 时,路径将被视为未填充,但边界框仍被视为已填充。旧行为可以被视为一个实现错误。

当调用 Path.intersects_bboxfilled 设置为 True(默认值)时,行为没有变化。对于那些 Path.intersects_bbox 被调用时 filled 设置为 False 且旧行为确实是所需行为的罕见情况,建议的解决方法是调用 Path.intersects_path 并以矩形作为路径

from matplotlib.path import Path
from matplotlib.transforms import Bbox, BboxTransformTo
rect = Path.unit_rectangle().transformed(BboxTransformTo(bbox))
result = path.intersects_path(rect, filled=False)

WX 不再生成 IdleEvent 事件或调用 idle_event#

FigureCanvasWx 中移除了未使用的私有方法 _onIdle

IdleEvent 类和 FigureCanvasBase.idle_event 方法将在 2.2 版本中移除。

修正 magnitude_spectrum() 的缩放#

函数 matplotlib.mlab.magnitude_spectrum()matplotlib.pyplot.magnitude_spectrum() 曾隐式地假设窗函数值的和为一。在 Matplotlib 和 Numpy 中,标准窗函数被缩放以使其最大值为一,这通常会导致 n 点信号的总和约为 n/2。因此,在使用标准窗函数时,magnitude_spectrum() 的振幅缩放会偏离这个量(Bug 8417)。现在,其行为与 matplotlib.pyplot.psd()scipy.signal.welch() 保持一致。以下示例展示了新旧缩放方式。

import matplotlib.pyplot as plt
import numpy as np

tau, n = 10, 1024  # 10 second signal with 1024 points
T = tau/n  # sampling interval
t = np.arange(n)*T

a = 4  # amplitude
x = a*np.sin(40*np.pi*t)  # 20 Hz sine with amplitude a

# New correct behavior: Amplitude at 20 Hz is a/2
plt.magnitude_spectrum(x, Fs=1/T, sides='onesided', scale='linear')

# Original behavior: Amplitude at 20 Hz is (a/2)*(n/2) for a Hanning window
w = np.hanning(n)  # default window is a Hanning window
plt.magnitude_spectrum(x*np.sum(w), Fs=1/T, sides='onesided', scale='linear')

bar()barh() 签名变更#

对于 2.0 版本,*align* 的默认值 变更为 'center'。然而,这导致 bar()barh() 的签名具有误导性,因为其第一个参数仍然分别是 *left* 和 *bottom*

bar(left, height, *, align='center', **kwargs)
barh(bottom, width, *, align='center', **kwargs)

尽管在这两种情况下都表现为中心。这些方法现在接受 *args, **kwargs 作为输入,并且其主要签名如下所示:

bar(x, height, *, align='center', **kwargs)
barh(y, width, *, align='center', **kwargs)

将 *left* 和 *bottom* 作为关键字参数分别传递给 bar()barh() 将会发出警告。此支持将在 Matplotlib 3.0 中移除。

字体缓存为 JSON 格式#

字体缓存现在保存为 JSON 格式,而不是 pickle 格式。

无效(非有限)轴限错误#

当使用 set_xlim()set_ylim() 时,传递非有限值现在会导致 ValueError。以前的行为是限制会被错误地重置为 (-0.001, 0.001)

scatterCollection 偏移不再隐式展平#

Collection(因此也包括 2D scatter 和 3D scatter)不再隐式展平其偏移。因此,scatterxy 参数不再可以是 2+ 维数组。

弃用#

GraphicsContextBaselinestyle 属性。#

已弃用 GraphicsContextBase.get_linestyleGraphicsContextBase.set_linestyle 方法,它们以前没有效果。Matplotlib 附带的所有后端都使用更通用的 GraphicsContextBase.get_dashesGraphicsContextBase.set_dashes。第三方后端也应迁移到 *_dashes 方法。

测试#

matplotlib.testing.noseclasses 已弃用,并将在 2.3 版本中移除。

EngFormatternum 参数为字符串#

在调用 matplotlib.ticker.EngFormatter 实例时,将字符串作为 *num* 参数传递已被弃用,并将在 2.3 版本中移除。

mpl_toolkits.axes_grid 模块#

mpl_toolkits.axes_grid 中的所有功能都可以在 mpl_toolkits.axes_grid1mpl_toolkits.axisartist 中找到。基于 mpl_toolkits.axisartist 中的 Axismpl_toolkits.axes_grid 中的 Axes 类可以在 mpl_toolkits.axisartist 中找到。

Figure.add_axes 中的 Axes 冲突#

通过使用与先前 axes 实例相同的参数向图形添加 axes 实例,目前会重用较早的实例。此行为已在 Matplotlib 2.1 中弃用。在未来的版本中,将始终创建并返回一个 *新* 实例。同时,在这种情况下,matplotlib.figure.AxesStack 会发出弃用警告。

通过为每个 axes 实例传递一个 *唯一* 的标签,可以抑制此警告并确保未来的行为。有关更多信息,请参阅 add_axes() 的文档字符串。

有关此弃用背后原理的更多详细信息,请参阅 #7377#9024

contour.negative_linestyle 的旧验证器#

以前的公共验证函数 validate_negative_linestylevalidate_negative_linestyle_legacy 将在 2.1 中弃用,并可能在 2.3 中移除。没有公共函数可以替代它们。

cbook#

许多未使用或很少使用的 matplotlib.cbook 函数和类已被弃用:converter, tostr, todatetime, todate, tofloat, toint, unique, is_string_like, is_sequence_of_strings, is_scalar, Sorter, Xlator, soundex, Null, dict_delall, RingBuffer, get_split_ind, wrap, get_recursive_filelist, pieces, exception_to_str, allequal, alltrue, onetrue, allpairs, finddir, reverse_dict, restrict_dict, issubclass_safe, recursive_remove, unmasked_index_ranges

代码移除#

qt4_compat.py#

已移至 qt_compat.py。由于现在也支持 Qt5,因此已重命名。

先前已弃用的方法#

已移除 GraphicsContextBase.set_graylevelFigureCanvasBase.onHilitempl_toolkits.axes_grid1.mpl_axes.Axes.toggle_axisline 方法。

已移除 ArtistInspector.findobj 方法,该方法由于缺少 get_children 方法而从未正常工作过。

已移除 matplotlib.path 模块中已弃用的 point_in_path, get_path_extents, point_in_path_collection, path_intersects_path, convert_path_to_polygons, cleanup_pathclip_path_to_rect 函数。它们的功能仍作为 Path 类的方法公开。

已移除已弃用的 Artist.get_axesArtist.set_axes 方法。

已移除 matplotlib.backends.backend_ps.seq_allequal 函数。请改用 np.array_equal

已移除已弃用的 matplotlib.rcsetup.validate_maskedarraymatplotlib.rcsetup.deprecate_savefig_extensionmatplotlib.rcsetup.validate_tkpythoninspect 函数,以及相关的 savefig.extensiontk.pythoninspect rcparams 条目。

已移除 matplotlib.projections.polar.PolarAxes 的关键字参数 *resolution*。从 *0.98.x* 版本开始,它已被弃用且无效果。

Axes.set_aspect("normal")#

已移除对将 Axes 的 aspect 设置为 "normal" 的支持,取而代之的是其同义词 "auto"

pcolorshading 关键字参数#

已移除 pcolorshading 关键字参数。请改为适当地设置 edgecolors

lines 模块中移除的函数#

matplotlib.lines 模块不再从 matplotlib.cbook 导入 pts_to_presteppts_to_midsteppts_to_poststep 函数。

PDF 后端函数#

已移除 matplotlib.backends.backend_pdf.PdfFileembedTeXFonttex_font_mapping 方法。外部用户不太可能调用这些方法,它们与 PDF 后端内部的字体系统相关。

matplotlib.delaunay#

移除 Delaunay 三角剖分代码,该功能现在通过 matplotlib.tri 由 Qhull 处理。