Matplotlib 2.1.0 版本更新 (2017年10月7日)#
文档#
示例已迁移为使用 sphinx gallery。这允许在示例中更好地混合散文和代码,提供将示例下载为 Python 脚本和 Jupyter notebook 的链接,并改进缩略图库。示例已重新组织为教程和示例。
许多文档字符串和示例已得到澄清和改进。
新功能#
字符串分类值#
所有绘图函数现在都支持将字符串分类值作为输入。例如:
data = {'apples': 10, 'oranges': 15, 'lemons': 5, 'limes': 20}
fig, ax = plt.subplots()
ax.bar(data.keys(), data.values(), color='lightgray')
用于动画的交互式 JS 小部件#
Jake Vanderplas 的 JSAnimation 包已合并到 Matplotlib 中。这为 Matplotlib 添加了 HTMLWriter
类,用于生成 JavaScript HTML 动画,适用于 IPython notebook。可以通过将 animation.html
rc 参数设置为 jshtml
来默认激活此功能。也可以调用 to_jshtml
方法手动转换动画。可以使用 IPython 的 HTML
显示类显示此动画
from IPython.display import HTML
HTML(animation.to_jshtml())
通过请求 html
写入器,HTMLWriter
类也可用于生成 HTML 文件。
极坐标图的增强功能#
极坐标轴变换已进行了大量重构,以允许更多自定义的视图限制和刻度标签。视图限制的其他选项允许创建环形、扇形或两者的某种组合。
可以使用 set_rorigin()
方法提供最小绘图半径的偏移量,从而生成环形。
set_theta_zero_location()
方法现在有一个可选的 offset
参数。此参数可用于根据给定的锚点进一步指定零位置。
可以使用 set_thetamin()
和 set_thetamax()
方法来限制绘制的角度范围,从而生成圆的扇形。
之前的版本允许绘制包含负半径的图,其中负值仅用作标签,实际半径按配置的最小值移动。此版本还允许将负半径用于网格和刻度,这些之前会被静默忽略。
径向刻度线已修改为与圆形网格线平行,角度刻度线已修改为与网格线平行。 将刻度标签旋转以匹配边界也可能很有用。 调用 ax.tick_params(rotation='auto')
将启用新行为:径向刻度标签将与圆形网格线平行,角度刻度标签将垂直于网格线(即与外边界平行)。 此外,刻度标签现在遵循之前仅在笛卡尔图中起作用的填充设置。 因此,不再应用 PolarAxes.set_thetagrids
的 frac
参数。 可以使用 Axes.tick_params
或 Axis.set_tick_params
的 pad
参数修改刻度填充。
Figure
类现在具有 subplots
方法#
Figure
类现在具有一个 subplots()
方法,其行为与 pyplot.subplots()
相同,但作用于现有图形。
Metadata savefig 关键字参数#
savefig()
现在接受 metadata
作为关键字参数。它可用于在图像元数据中存储键/值对。
使用 Agg 后端的 'png'
使用 PDF 后端的 'pdf' (有关支持的关键字列表,请参见
writeInfoDict()
)使用 PS 后端的 'eps' 和 'ps'(仅接受 'Creator' 键)
plt.savefig('test.png', metadata={'Software': 'My awesome software'})
忙碌光标#
当 Matplotlib 渲染画布时,交互式 GUI 后端现在会将光标更改为忙碌状态。
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()
mplot3d 的 voxels
函数#
Axes3D
现在具有一个 voxels
方法,用于可视化布尔 3D 数据。用途可能包括绘制稀疏 3D 热图或可视化体积模型。
改进#
向 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()
注释可以使用默认的箭头样式#
现在,当设置 arrowprops={}
时,注释将使用默认的箭头样式,而不是没有箭头(新行为实际上与文档匹配)。
倒刺和箭袋支持日期#
当使用 quiver()
和 barbs()
绘图方法时,现在可以像其他方法(如 plot()
)一样传递日期。这也允许这些函数处理需要应用单位转换的值。
六边形箱默认线条颜色#
hexbin()
的默认 linecolor
关键字参数现在是 'face'
,并且提供 'none'
现在可以防止在六边形周围绘制线条。
可以不带参数调用 Figure.legend()#
现在可以不带任何参数调用 Figure.legend()
。在这种情况下,将创建一个图例,其中包含图中所有轴上的所有艺术家。
图例条目的多个图例键#
一个图例条目现在可以包含多个图例键。扩展的 HandlerTuple
类现在接受两个参数:ndivide
将图例区域划分为指定数量的部分;pad
更改图例键之间的填充。
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
关键字参数,该参数设置绘制键箭头的角度。
颜色映射反转方法#
方法 matplotlib.colors.LinearSegmentedColormap.reversed()
和 matplotlib.colors.ListedColormap.reversed()
返回 Colormap 的反转实例。这实现了一种反转任何 Colormap 的方法。
artist.setp
(和 pyplot.setp
) 接受 file 参数#
该参数是仅关键字参数。它允许指定除 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)
3D 条形图中的阴影#
3D bar
绘图方法中添加了一个新的 shade
参数。默认行为仍然是为条形图添加阴影,但现在用户可以选择将 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()
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
参数。这允许用户指定将在其中创建子图的 figure。如果 fig
为 None
(默认值),则该方法将使用 gcf()
获取的当前 figure。
subplot2grid(shape, loc, rowspan=1, colspan=1, fig=myfig)
fill_betweenx
中的插值#
现在,方法 fill_betweenx()
存在一个 interpolate
参数。这允许用户插值数据并填充交叉点区域,类似于 fill_between()
。
EngFormatter 的新关键字参数 sep
#
已向 EngFormatter
添加了一个新的 sep
关键字参数,它提供了一种定义值及其单位之间将使用的字符串的方法。默认字符串为 " "
,它保留了之前的行为。此外,即使在没有 SI 前缀的情况下,分隔符现在也存在于值及其单位之间。以前存在一个错误,导致返回的字符串类似于 "3.14V"
,而不是预期的 "3.14 V"
(使用默认行为)。
扩展 MATPLOTLIBRC
行为#
环境变量现在可以指定完整的文件路径或包含 matplotlibrc
文件的目录的路径。
hist
的 density
kwarg#
方法 hist()
现在更倾向于使用 density
而不是 normed
来控制是否应该对直方图进行归一化,这遵循了 NumPy 的上游更改。这将减少混淆,因为行为始终是直方图的积分值为 1(而不是总和或最大值)。
内部机制#
新的 TransformedPatchPath 缓存对象#
新添加的 TransformedPatchPath
提供了一种通过 Transform
将 Patch
转换为 Path
的方法,同时缓存生成的路径。如果补丁或变换都没有更改,则会返回路径的缓存副本。
此类与旧的 TransformedPath
的区别在于,它可以根据底层补丁刷新自身,而旧类使用不可变的路径。
电影编写器的抽象基类#
新的 AbstractMovieWriter
类定义了作为 matplotlib.animation.Animation.save()
方法中的 writer
使用的类所必需的 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
参数控制的线简化已得到改进。当绘制大量数据时,您应该会注意到更好的渲染性能(只要相应地设置了上述参数)。只有路径的线段部分将被简化 -- 如果您也在绘制标记并且遇到渲染速度问题,则应考虑使用 plot
的 markevery
选项。有关更多信息,请参阅使用教程中的 性能 部分。
简化工作原理是将线段迭代合并为一个向量,直到下一个线段与该向量的垂直距离(以显示坐标空间测量)大于 path.simplify_threshold
参数。因此,path.simplify_threshold
的值越高,渲染时间就越快。如果您绘制只是为了探索数据而不是为了出版质量的像素完美图,则可以安全地使用 1.0
的值。如果您想确保绘图完全反映您的数据,则应将 path.simplify
设置为 false 和/或将 path.simplify_threshold
设置为 0
。Matplotlib 目前默认为保守值 1/9
,较小的值不太可能导致您的绘图出现任何可见的差异。
在 c++ 中实现 intersects_bbox#
intersects_bbox()
已在 c++ 中实现,这提高了自动放置图例的性能。