Matplotlib 2.1.0 的新特性 (2017年10月7日)#
文档#
示例已迁移至使用 sphinx gallery 。这使得在示例中更好地混合了散文和代码,提供了下载示例为Python脚本和Jupyter笔记本的链接,并改进了缩略图画廊。示例已重新组织为 教程 和 画廊 。
许多文档字符串和示例已经得到澄清和改进。
新功能#
字符串分类值#
所有绘图函数现在都支持字符串分类值作为输入。例如:
data = {'apples': 10, 'oranges': 15, 'lemons': 5, 'limes': 20}
fig, ax = plt.subplots()
ax.bar(data.keys(), data.values(), color='lightgray')
(Source code, 2x.png, png)
用于动画的交互式JS小部件#
Jake Vanderplas 的 JSAnimation 包已合并到 Matplotlib 中。这为 Matplotlib 添加了 HTMLWriter 类,用于生成适合 IPython 笔记本的 JavaScript HTML 动画。可以通过将 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 参数。这个参数可以用来进一步根据给定的锚点指定零点的位置。
极坐标偏移演示#
可以使用 set_thetamin() 和 set_thetamax() 方法来限制绘制的角度范围,从而生成圆的扇区。
极区演示#
之前的版本允许包含负半径的图表,其中负值仅用作标签,实际半径通过配置的最小值进行偏移。此版本还允许负半径用于网格和刻度,这在以前会被静默忽略。
径向刻度已修改为与圆形网格线平行,角度刻度已修改为与网格线平行。将刻度*标签*旋转以匹配边界也可能是有用的。调用 ax.tick_params(rotation='auto') 将启用新行为:径向刻度标签将与圆形网格线平行,角度刻度标签将与网格线垂直(即与外边界平行)。此外,刻度标签现在遵守以前仅在笛卡尔图上有效的填充设置。因此,PolarAxes.set_thetagrids 的 frac 参数不再适用。刻度填充可以通过 pad 参数在 Axes.tick_params 或 Axis.set_tick_params 中修改。
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()
(Source code, 2x.png, png)
voxels 函数用于 mplot3d#
Axes3D 现在有一个 voxels 方法,用于可视化布尔型三维数据。用途可能包括绘制稀疏的三维热图,或可视化体积模型。
体素演示#
改进#
向 AnchoredSizeBar 添加 fill_bar 参数#
mpl_toolkits 类 AnchoredSizeBar 现在有一个额外的 fill_bar 参数,它使尺寸条成为一个实心矩形,而不仅仅是绘制矩形的边框。默认值是 None,尺寸条是否默认填充取决于 size_vertical 的值。如果 size_vertical 非零,fill_bar 将被设置为 True。如果 size_vertical 为零,则 fill_bar 将被设置为 False。如果你想覆盖这个默认行为,将 fill_bar 设置为 True 或 False,以无条件地始终或从不使用填充的补丁矩形作为尺寸条。
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()
(Source code, 2x.png, png)
注释可以使用默认的箭头样式#
现在,当设置 arrowprops={} 时,注释使用默认的箭头样式,而不是没有箭头(新的行为实际上与文档相符)。
Barbs 和 Quiver 支持日期#
在使用 quiver() 和 barbs() 绘图方法时,现在可以像 plot() 等其他方法一样传递日期。这也使得这些函数能够处理需要进行单位转换的值。
Hexbin 默认线条颜色#
对于 hexbin() 的默认 linecolor 关键字参数现在是 'face',并且提供 'none' 现在会阻止在六边形周围绘制线条。
Figure.legend() 可以不带参数调用#
调用 Figure.legend() 现在可以不带参数进行。在这种情况下,将创建一个包含图中所有轴上所有艺术家的图例。
图例条目的多个图例键#
一个图例条目现在可以包含多个图例键。扩展的 HandlerTuple 类现在接受两个参数:ndivide 将图例区域划分为指定数量的部分;pad 改变图例键之间的填充。
多个图例键#
为 figure() 添加了新参数 clear#
当调用 pyplot 的函数 figure() 并带有 num 参数时,只有在没有相同值的现有窗口时才会创建新窗口。新增了一个布尔参数 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 关键字参数,该参数设置绘制关键箭头的角度。
颜色映射反转方法#
方法 matplotlib.colors.LinearSegmentedColormap.reversed() 和 matplotlib.colors.ListedColormap.reversed() 返回 Colormap 的反转实例。这为任何 Colormap 提供了一种反转的方法。
artist.setp (以及 pyplot.setp) 接受一个 文件 参数#
该参数是仅关键字的。它允许指定一个输出文件,而不是 sys.stdout。它的工作原理与 print 的 file 参数完全相同。
streamplot 流线生成更加可配置#
现在可以配置流线的起点、方向和长度。这使得可以更长时间地跟随矢量场,并且在某些用例中可以增强流动模式的可见性。
Axis.set_tick_params 现在响应 rotation 参数#
现在可以通过使用 rotation 关键字通过 tick_params() 进行刻度标签旋转的批量设置。
ax.tick_params(which='both', rotation=90)
刻度标签被关闭而不是不可见#
在内部,Tick 的 matplotlib.axis.Tick.label1On 属性现在用于隐藏刻度标签,而不是在刻度标签对象上设置可见性。这提高了整体性能并修复了一些问题。因此,如果这些标签需要显示,则需要使用 tick_params(),例如。
ax.tick_params(labelbottom=True)
三维条形图中的阴影#
新的 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()
(Source code, 2x.png, png)
新的 which 参数用于 autofmt_xdate#
方法 autofmt_xdate() 现在存在一个 which 参数。这允许用户选择性地格式化 major、minor 或 both 刻度标签。默认行为将旋转并调整 major 刻度标签。
fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right', which='minor')
subplot2grid 的新图形参数#
函数 subplot2grid() 现在有一个 fig 参数。这允许用户指定创建子图的图形。如果 fig 为 ``None``(默认),则该方法将使用由 gcf() 检索到的当前图形。
subplot2grid(shape, loc, rowspan=1, colspan=1, fig=myfig)
fill_betweenx 中的插值#
interpolate 参数现在存在于方法 fill_betweenx() 中。这允许用户插值数据并在交叉点填充区域,类似于 fill_between()。
新关键字参数 sep 用于 EngFormatter#
一个新的 sep 关键字参数已添加到 EngFormatter 中,并提供了一种定义在数值和其单位之间使用的字符串的方法。默认字符串是 " ",这保留了之前的行为。此外,即使在没有SI前缀的情况下,分隔符现在也存在于数值和其单位之间。以前存在一个错误,导致返回类似 "3.14V" 的字符串,而不是预期的 ``"3.14 V"``(使用默认行为)。
扩展 MATPLOTLIBRC 行为#
环境变量现在可以指定完整的文件路径或包含 matplotlibrc 文件的目录路径。
density 参数用于 hist#
现在,hist() 方法更倾向于使用 density 而不是 normed 来控制直方图是否应该归一化,这是遵循上游 NumPy 的更改。这将减少混淆,因为直方图的行为始终是使其积分值为 1(而不是总和或最大值)。
内部机制#
新的 TransformedPatchPath 缓存对象#
新添加的 TransformedPatchPath 提供了一种通过 Transform 将 Patch 转换为 Path 的方法,同时缓存生成的路径。如果补丁或变换都没有改变,则返回路径的缓存副本。
这个类与旧的 TransformedPath 不同之处在于,它能够根据底层补丁自行刷新,而旧类使用的是不可变路径。
电影写入器的抽象基类#
新的 AbstractMovieWriter 类定义了作为 writer 在 matplotlib.animation.Animation.save() 方法中使用的类所需的API。现有的 MovieWriter 类现在派生自新的抽象基类。
更严格的线条样式 rcParams 验证#
与线型相关的 rcParams 验证(lines.linestyle、boxplot.*.linestyle、grid.linestyle 和 contour.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#
性能#
路径简化更新#
由 path.simplify 和 path.simplify_threshold 参数控制的线条简化功能已得到改进。在绘制大量数据时,您应该会注意到更好的渲染性能(只要上述参数设置得当)。只有路径的线段部分会被简化——如果您还在绘制标记并且遇到渲染速度问题,您应该考虑使用 markevery 选项来 plot。更多信息请参阅使用教程中的 性能 部分。
简化过程通过迭代地将线段合并为一个向量,直到下一线段到该向量的垂直距离(在显示坐标空间中测量)大于 path.simplify_threshold 参数。因此,path.simplify_threshold 的值越高,渲染时间越快。如果你只是为了探索数据而不是为了出版质量、像素完美的绘图,那么可以使用 1.0 的值。如果你想确保你的图表完全反映你的数据,那么你应该将 path.simplify 设置为 false 和/或将 path.simplify_threshold 设置为 0。Matplotlib 目前默认使用一个保守的值 1/9,较小的值不太可能在你的图表中引起任何可见的差异。
在 C++ 中实现 intersects_bbox#
intersects_bbox() 已在 c++ 中实现,这提高了自动放置图例的性能。