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 处理。