2.1.0 中的 API 变更#
对数刻度默认行为改为屏蔽小于等于 0 的值#
调用 matplotlib.axes.Axes.set_xscale 或 matplotlib.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 键绑定可以独立切换 x 和 y 网格的状态(通过循环切换所有四种开/关组合)。
新的 G 键绑定切换次要网格的状态。
如果仅网格线(任一方向)的子集可见,则这两个绑定都会被禁用,以避免对图形进行不可逆的更改。
刻度标签被关闭而非隐藏#
在内部,Tick 的 ~matplotlib.axis.Tick.label1On 属性现在用于隐藏刻度标签,而不是设置刻度标签对象的可见性。这提高了整体性能并解决了一些问题。因此,如果这些标签需要显示,则需要使用 tick_params(),例如:
ax.tick_params(labelbottom=True)
移除空图例警告#
pyplot.legend 以前在找不到带标签的艺术家时会发出警告。此警告已被移除。
更精确的图例自动定位#
图例的自动定位现在倾向于使用 Line2D 包围的区域,而不是将图例放置在线本身之上。
清理股票样本数据#
股票样本数据已清理,以消除冗余并提高可移植性。AAPL.dat.gz、INTC.dat.gz 和 aapl.csv 文件已完全删除,并且将不再通过 matplotlib.cbook.get_sample_data 提供。如果需要 CSV 文件,建议使用样本数据中继续提供的 msft.csv。如果 NumPy 二进制文件可以接受,建议使用以下两个新文件。aapl.npy.gz 和 goog.npy 文件已被 aapl.npz 和 goog.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.tricontour、matplotlib.pyplot.tricontourf、matplotlib.pyplot.tripcolor、matplotlib.pyplot.triplot、matplotlib.mlab.griddata 和 mpl_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_bbox 且 filled 设置为 False 时,它会将路径和边界框都视为未填充。此行为未得到充分文档说明,并且通常不是所需行为,因为边界框用于表示位于边界框内部的更复杂的形状。此行为现已更改:当 filled 为 False 时,路径将被视为未填充,但边界框仍被视为已填充。旧行为可以被视为一个实现错误。
当调用 Path.intersects_bbox 且 filled 设置为 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)。
scatter 和 Collection 偏移不再隐式展平#
Collection(因此也包括 2D scatter 和 3D scatter)不再隐式展平其偏移。因此,scatter 的 x 和 y 参数不再可以是 2+ 维数组。
弃用#
GraphicsContextBase 的 linestyle 属性。#
已弃用 GraphicsContextBase.get_linestyle 和 GraphicsContextBase.set_linestyle 方法,它们以前没有效果。Matplotlib 附带的所有后端都使用更通用的 GraphicsContextBase.get_dashes 和 GraphicsContextBase.set_dashes。第三方后端也应迁移到 *_dashes 方法。
测试#
matplotlib.testing.noseclasses 已弃用,并将在 2.3 版本中移除。
EngFormatter 的 num 参数为字符串#
在调用 matplotlib.ticker.EngFormatter 实例时,将字符串作为 *num* 参数传递已被弃用,并将在 2.3 版本中移除。
mpl_toolkits.axes_grid 模块#
mpl_toolkits.axes_grid 中的所有功能都可以在 mpl_toolkits.axes_grid1 或 mpl_toolkits.axisartist 中找到。基于 mpl_toolkits.axisartist 中的 Axis 的 mpl_toolkits.axes_grid 中的 Axes 类可以在 mpl_toolkits.axisartist 中找到。
Figure.add_axes 中的 Axes 冲突#
通过使用与先前 axes 实例相同的参数向图形添加 axes 实例,目前会重用较早的实例。此行为已在 Matplotlib 2.1 中弃用。在未来的版本中,将始终创建并返回一个 *新* 实例。同时,在这种情况下,matplotlib.figure.AxesStack 会发出弃用警告。
通过为每个 axes 实例传递一个 *唯一* 的标签,可以抑制此警告并确保未来的行为。有关更多信息,请参阅 add_axes() 的文档字符串。
contour.negative_linestyle 的旧验证器#
以前的公共验证函数 validate_negative_linestyle 和 validate_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_graylevel、FigureCanvasBase.onHilite 和 mpl_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_path 和 clip_path_to_rect 函数。它们的功能仍作为 Path 类的方法公开。
已移除已弃用的 Artist.get_axes 和 Artist.set_axes 方法。
已移除 matplotlib.backends.backend_ps.seq_allequal 函数。请改用 np.array_equal。
已移除已弃用的 matplotlib.rcsetup.validate_maskedarray、matplotlib.rcsetup.deprecate_savefig_extension 和 matplotlib.rcsetup.validate_tkpythoninspect 函数,以及相关的 savefig.extension 和 tk.pythoninspect rcparams 条目。
已移除 matplotlib.projections.polar.PolarAxes 的关键字参数 *resolution*。从 *0.98.x* 版本开始,它已被弃用且无效果。
Axes.set_aspect("normal")#
已移除对将 Axes 的 aspect 设置为 "normal" 的支持,取而代之的是其同义词 "auto"。
pcolor 的 shading 关键字参数#
已移除 pcolor 的 shading 关键字参数。请改为适当地设置 edgecolors。
从 lines 模块中移除的函数#
matplotlib.lines 模块不再从 matplotlib.cbook 导入 pts_to_prestep、pts_to_midstep 和 pts_to_poststep 函数。
PDF 后端函数#
已移除 matplotlib.backends.backend_pdf.PdfFile 的 embedTeXFont 和 tex_font_mapping 方法。外部用户不太可能调用这些方法,它们与 PDF 后端内部的字体系统相关。
matplotlib.delaunay#
移除 Delaunay 三角剖分代码,该功能现在通过 matplotlib.tri 由 Qhull 处理。