Matplotlib 2.1.0 更新内容 (2017年10月7日)#

文档#

示例已迁移至使用 sphinx gallery。这使得示例中的说明文字与代码能够更好地结合,并提供了以 Python 脚本和 Jupyter notebook 格式下载示例的链接,同时改进了缩略图库。示例已重新组织为 教程 (Tutorials)示例 (Examples)

许多文档字符串(docstrings)和示例得到了澄清和完善。

新特性#

字符串分类值#

现在所有的绘图函数都支持将字符串分类值作为输入。例如

data = {'apples': 10, 'oranges': 15, 'lemons': 5, 'limes': 20}
fig, ax = plt.subplots()
ax.bar(data.keys(), data.values(), color='lightgray')

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

用于动画的交互式 JS 小部件#

Jake Vanderplas 的 JSAnimation 包已合并到 Matplotlib 中。这为 Matplotlib 增加了用于生成 JavaScript HTML 动画的 HTMLWriter 类,适用于 IPython notebook。通过将 animation.html rc 参数设置为 jshtml,可以默认启用此功能。也可以调用 to_jshtml 方法手动转换动画。这可以使用 IPython 的 HTML 显示类来展示。

from IPython.display import HTML
HTML(animation.to_jshtml())

HTMLWriter 类还可以通过请求 html 写入器来生成 HTML 文件。

极坐标图的增强#

极坐标轴变换进行了大幅重构,以允许对视图限制和刻度标签进行更多自定义。视图限制的额外选项允许创建圆环、扇形或两者的组合。

set_rorigin() 方法可用于为最小绘图半径提供偏移量,从而产生一个圆环。

set_theta_zero_location() 方法现在有一个可选的 offset 参数。该参数可用于基于给定的锚点进一步指定零位位置。

../../_images/sphx_glr_polar_scatter_002.png

极坐标偏移演示#

set_thetamin()set_thetamax() 方法可用于限制绘制的角度范围,从而产生圆形扇区。

../../_images/sphx_glr_polar_scatter_003.png

极坐标扇区演示#

以前的版本允许包含负半径的图,其中负值仅用作标签,而实际半径由配置的最小值偏移。此版本现在也允许负半径用于网格和刻度,这些在以前会被静默忽略。

径向刻度已被修改为与圆形网格线平行,角度刻度已被修改为与网格线平行。旋转刻度标签以匹配边界也可能很有用。调用 ax.tick_params(rotation='auto') 将启用新行为:径向刻度标签将平行于圆形网格线,角度刻度标签将垂直于网格线(即平行于外边界)。此外,刻度标签现在遵守之前仅适用于笛卡尔坐标系绘图的填充设置。因此,传递给 PolarAxes.set_thetagridsfrac 参数不再适用。刻度填充可以通过 Axes.tick_paramsAxis.set_tick_paramspad 参数进行修改。

Figure 类现在拥有 subplots 方法#

Figure 类现在拥有一个 subplots() 方法,其行为与 pyplot.subplots() 相同,但作用于现有的图形。

元数据 savefig 关键字参数#

savefig() 现在接受 metadata 作为关键字参数。它可用于在图像元数据中存储键/值对。

  • 'png' 与 Agg 后端

  • 'pdf' 与 PDF 后端(支持的关键字列表请参阅 writeInfoDict()

  • 'eps' 和 'ps' 与 PS 后端(仅接受 'Creator' 键)

plt.savefig('test.png', metadata={'Software': 'My awesome software'})

忙碌光标#

交互式 GUI 后端现在会在 Matplotlib 渲染画布时将光标更改为忙碌状态。

PolygonSelector#

一个 PolygonSelector 类已被添加到 matplotlib.widgets 中。详情请参阅 使用多边形选择器从集合中选择索引

添加了 matplotlib.ticker.PercentFormatter#

新的 PercentFormatter 格式化程序具有一些不错的功能,例如能够将任意数据比例转换为百分比、可自定义的百分比符号以及对小数点的自动或手动控制。

可重现的 PS、PDF 和 SVG 输出#

SOURCE_DATE_EPOCH 环境变量现在可用于设置 PS 和 PDF 输出中的时间戳值。请参阅 source date epoch

或者,调用带有 metadata={'CreationDate': None}savefig 将为 PDF 后端完全省略时间戳。

PS 和 PDF 后端的输出可重现性到目前为止已使用各种绘图元素进行了测试,但仅针对 {ps,pdf}.fonttype 等选项的默认值进行了测试,这些值可能会在底层影响输出,而没有针对 mathtext 或 usetex 功能进行测试。当 Matplotlib 调用外部工具(例如 PS 蒸馏器或 LaTeX)时,它们的版本需要保持恒定以实现可重现性,并且它们可能会引入 Matplotlib 无法控制的不确定性来源。

对于 SVG 输出,svg.hashsalt rc 参数已在较早版本中添加。此参数将 SVG 文件中的某些随机标识符更改为确定性的。此设置的缺点是,如果使用确定性标识符生成了多个文件,并且它们最终成为更大文档的一部分,则标识符可能会冲突并导致不同部分相互影响。

这些功能现在已在 PDF 和 SVG 后端的测试中启用,因此大多数(但并非所有)测试输出文件现在都是确定性的。

mplot3d 的正交投影#

Axes3D 现在接受 proj_type 关键字参数,并具有一个 set_proj_type() 方法。默认选项仍然是 'persp'(透视),提供 'ortho' 则启用正交视图。

比较 Z 轴,它在正交视图中是垂直的,但在透视视图中略有倾斜。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(4, 6))
ax1 = fig.add_subplot(2, 1, 1, projection='3d')
ax1.set_proj_type('persp')
ax1.set_title('Perspective (default)')

ax2 = fig.add_subplot(2, 1, 2, projection='3d')
ax2.set_proj_type('ortho')
ax2.set_title('Orthographic')

plt.show()

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

mplot3d 的 voxels 函数#

Axes3D 现在有一个 voxels 方法,用于可视化布尔 3D 数据。其用途包括绘制稀疏 3D 热图或可视化体积模型。

../../_images/sphx_glr_voxels_numpy_logo_001.png

体素演示#

改进#

CheckButtons 小部件的 get_status 函数#

一个 get_status() 方法已被添加到 matplotlib.widgets.CheckButtons 类中。此 get_status 方法允许用户查询 CheckButtons 对象中所有按钮的状态(True/False)。

AnchoredSizeBar 添加 fill_bar 参数#

mpl_toolkitsAnchoredSizeBar 现在增加了一个 fill_bar 参数,它使比例尺变为一个实心矩形,而不是仅仅绘制矩形的边框。默认值为 None,比例尺是否默认填充取决于 size_vertical 的值。如果 size_vertical 不为零,fill_bar 将被设置为 True。如果 size_vertical 为零,则 fill_bar 将被设置为 False。如果您希望覆盖此默认行为,请将 fill_bar 设置为 TrueFalse,以强制始终或从不为比例尺使用填充补丁矩形。

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar

fig, ax = plt.subplots(figsize=(3, 3))

bar0 = AnchoredSizeBar(ax.transData, 0.3, 'unfilled', loc='lower left',
                       frameon=False, size_vertical=0.05, fill_bar=False)
ax.add_artist(bar0)
bar1 = AnchoredSizeBar(ax.transData, 0.3, 'filled', loc='lower right',
                       frameon=False, size_vertical=0.05, fill_bar=True)
ax.add_artist(bar1)

plt.show()

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

注释可以使用默认箭头样式#

当设置 arrowprops={} 时,注释现在会使用默认箭头样式,而不是没有箭头(新行为实际上符合文档说明)。

Barbs 和 Quiver 支持日期#

当使用 quiver()barbs() 绘图方法时,现在可以像传递其他方法(如 plot())一样传递日期。这也允许这些函数处理需要进行单位转换的值。

Hexbin 默认线条颜色#

hexbin() 的默认 linecolor 关键字参数现在是 'face',提供 'none' 现在可以防止在六边形周围绘制线条。

Figure.legend() 可以无参数调用#

调用 Figure.legend() 现在可以不带参数。在这种情况下,将创建一个图例,其中包含图形中包含的所有轴上的所有艺术家对象。

图例条目的多个图例键#

图例条目现在可以包含多个图例键。扩展的 HandlerTuple 类现在接受两个参数:ndivide 将图例区域划分为指定的数量;pad 更改图例键之间的填充。

../../_images/sphx_glr_legend_demo_004.png

多个图例键#

figure() 的新参数 clear#

当使用 num 参数调用 pyplot 函数 figure() 时,仅当不存在具有相同值的现有窗口时才会创建新窗口。添加了一个新的布尔参数 clear,用于显式清除其现有内容。这在交互式会话中使用时特别有用。由于 subplots() 也接受来自 figure() 的关键字参数,它也可以在那里使用。

import matplotlib.pyplot as plt

fig0 = plt.figure(num=1)
fig0.suptitle("A fancy plot")
print("fig0.texts: ", [t.get_text() for t in fig0.texts])

fig1 = plt.figure(num=1, clear=False)  # do not clear contents of window
fig1.text(0.5, 0.5, "Really fancy!")
print("fig0 is fig1: ",  fig0 is fig1)
print("fig1.texts: ", [t.get_text() for t in fig1.texts])

fig2, ax2 = plt.subplots(2, 1, num=1, clear=True)  # clear contents
print("fig0 is fig2: ",  fig0 is fig2)
print("fig2.texts: ", [t.get_text() for t in fig2.texts])

# The output:
# fig0.texts:  ['A fancy plot']
# fig0 is fig1:  True
# fig1.texts:  ['A fancy plot', 'Really fancy!']
# fig0 is fig2:  True
# fig2.texts:  []

LogFormatterMathtext 指定格式化为标量的最小值#

LogFormatterMathtext 现在包含一个选项,用于指定格式化为标量(即 0.001 而不是 10-3)的最小数值指数。

新的 quiverkey 角度关键字参数#

绘制 quiverkey() 现在承认 angle 关键字参数,该参数设置绘制关键箭头的角度。

颜色映射(Colormap)的 reversed 方法#

方法 matplotlib.colors.LinearSegmentedColormap.reversed()matplotlib.colors.ListedColormap.reversed() 返回颜色映射的一个反转实例。这为任何颜色映射的反转实现了一种方法。

artist.setp (以及 pyplot.setp) 接受 file 参数#

该参数是仅限关键字的参数。它允许指定除 sys.stdout 之外的输出文件。它的工作方式与 printfile 参数完全相同。

streamplot 流线生成更具可配置性#

现在可以配置流线的起点、方向和长度。这允许跟踪向量场更长的时间,并可以在某些用例中增强流模式的可见性。

Axis.set_tick_params 现在响应 rotation#

现在可以通过 tick_params() 使用 rotation 关键字批量设置刻度标签旋转。

ax.tick_params(which='both', rotation=90)

刻度标签被关闭而不是变得不可见#

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

ax.tick_params(labelbottom=True)

3D 条形图中的阴影#

一个新的 shade 参数已被添加到 3D bar 绘图方法中。默认行为仍然是为条形添加阴影,但现在用户可以选择将 shade 设置为 False

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x = np.arange(2)
y = np.arange(3)
x2d, y2d = np.meshgrid(x, y)
x, y = x2d.ravel(), y2d.ravel()
z = np.zeros_like(x)
dz = x + y

fig = plt.figure(figsize=(4, 6))
ax1 = fig.add_subplot(2, 1, 1, projection='3d')
ax1.bar3d(x, y, z, 1, 1, dz, shade=True)
ax1.set_title('Shading On')

ax2 = fig.add_subplot(2, 1, 2, projection='3d')
ax2.bar3d(x, y, z, 1, 1, dz, shade=False)
ax2.set_title('Shading Off')

plt.show()

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

autofmt_xdate 的新 which 参数#

方法 autofmt_xdate() 现在存在一个 which 参数。这允许用户选择性地格式化 major(主)、minor(次)或 both(两者)刻度标签。默认行为将旋转并对齐 major 刻度标签。

fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right', which='minor')

subplot2grid 的新 Figure 参数#

函数 subplot2grid() 现在有一个 fig 参数。这允许用户指定将要创建子图的图形。如果 figNone(默认),则该方法将使用通过 gcf() 获取的当前图形。

subplot2grid(shape, loc, rowspan=1, colspan=1, fig=myfig)

fill_betweenx 中的插值#

方法 fill_betweenx() 现在存在 interpolate 参数。这允许用户插值数据并在交叉点填充区域,类似于 fill_between()

EngFormatter 的新关键字参数 sep#

一个新的 sep 关键字参数已被添加到 EngFormatter 中,并提供了一种定义用于值及其单位之间的字符串的方法。默认字符串是 " ",这保留了以前的行为。此外,即使在没有 SI 前缀的情况下,分隔符现在也出现在值及其单位之间。以前有一个错误导致返回像 "3.14V" 这样的字符串,而不是预期的 "3.14 V"(使用默认行为)。

扩展 MATPLOTLIBRC 行为#

环境变量现在可以指定完整的文件路径,或者指定包含 matplotlibrc 文件的目录路径。

hist 的 density 参数#

hist() 方法现在倾向于使用 density 而不是 normed 来控制直方图是否应该被归一化,这遵循了 NumPy 上游的变更。这将减少混淆,因为直方图的行为始终是直方图的积分为 1(而不是和或最大值)。

内部结构#

新的 TransformedPatchPath 缓存对象#

新添加的 TransformedPatchPath 提供了一种通过 TransformPatch 转换为 Path 的方法,同时缓存结果路径。如果补丁和变换都没有改变,则返回路径的缓存副本。

此类与旧的 TransformedPath 的不同之处在于它能够根据底层补丁自动刷新自己,而旧类使用的是不可变路径。

电影编写器的抽象基类#

新的 AbstractMovieWriter 类定义了在 matplotlib.animation.Animation.save() 方法中用作 writer 的类所需的 API。现有的 MovieWriter 类现在派生自这个新的抽象基类。

对线型 rcParams 的更严格验证#

与线型相关的 rcParams(lines.linestyleboxplot.*.linestylegrid.linestylecontour.negative_linestyle)的验证现在有效地检查值是否为有效的线型。像 'dashed''--' 这样的字符串被接受,就像偶数长度的开-关墨水序列如 [1, 1.65] 一样。在后一种情况下,偏移值在内部处理,不应由用户提供。

新的验证方案取代了以前用于 contour.negative_linestyle rcParams 的方案,该方案仅限于 'solid''dashed' 线型。

验证不区分大小写。以下现在是有效的

grid.linestyle             : (1, 3)   # loosely dotted grid lines
contour.negative_linestyle : dashdot  # previously only solid or dashed

pytest#

自动化测试已从 nose 切换到 pytest

性能#

路径简化更新#

path.simplifypath.simplify_threshold 参数控制的线简化已得到改进。在绘制大量数据时,您应该会注意到更好的渲染性能(只要相应地设置了上述参数)。只有路径的线段部分会被简化——如果您还在绘制标记并遇到渲染速度问题,您应该考虑使用 plotmarkevery 选项。有关详细信息,请参阅使用教程中的 性能 部分。

简化工作通过迭代地将线段合并为单个向量来实现,直到下一个线段到该向量的垂直距离(在显示坐标空间中测量)大于 path.simplify_threshold 参数。因此,path.simplify_threshold 的值越高,渲染时间越快。如果您绘制仅仅是为了探索数据,而不是为了出版质量、像素完美的图,那么可以安全地使用 1.0 的值。如果您想确保您的绘图完全反映您的数据,那么您应该将 path.simplify 设置为 false 和/或将 path.simplify_threshold 设置为 0。Matplotlib 目前默认为保守值 1/9,较小的值不太可能在您的绘图中引起任何可见的差异。

用 C++ 实现 intersects_bbox#

intersects_bbox() 已用 C++ 实现,这提高了自动放置图例的性能。