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')

(Source code, png)

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

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

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

HTMLWriter 类也可以通过请求 html writer 来生成 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() 的行为相同,但在现有图形上.

Metadata savefig 关键字参数#

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

  • 'png',使用Agg后端

  • 'pdf',使用PDF后端 (有关支持的关键字列表,请参见 writeInfoDict() )

  • 'eps'和'ps',使用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 distiller或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, 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).

fill_bar 参数添加到 AnchoredSizeBar#

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()

(Source code, 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() 时,只有在不存在具有相同值的现有窗口时,才会创建一个新窗口.添加了一个新的 bool 参数 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 angle 关键字参数#

绘制 quiverkey() 现在允许使用 angle 关键字参数,该参数设置绘制键箭头的角度.

Colormap reversed 方法#

方法 matplotlib.colors.LinearSegmentedColormap.reversed()matplotlib.colors.ListedColormap.reversed() 返回 Colormap 的反转实例.这实现了一种反转任何 Colormap 的方法.

.artist.setp (和 .pyplot.setp ) 接受文件参数#

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

streamplot 流线生成更可配置#

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

Axis.set_tick_params 现在响应旋转#

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

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()

(Source code, png)

autofmt_xdate 的新 which 参数#

autofmt_xdate() 方法现在存在一个 which 参数.这允许用户有选择地格式化 major , minorboth 刻度标签.默认行为将旋转和对齐 major 刻度标签.

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

subplot2grid 的新 Figure 参数#

subplot2grid() 函数现在存在一个 fig 参数.这允许用户指定将在其中创建子图的figure.如果 figNone (默认),则该方法将使用 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 提供了一种通过 PatchPath 转换为 Transform ,同时缓存结果路径的方法.如果 patch 和 transform 都没有更改,则会返回路径的缓存副本.

此类与旧的 TransformedPath 的不同之处在于,它可以根据底层 patch 刷新自身,而旧类使用不可变的路径.

电影写入器的抽象基类#

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

更严格的线条样式 rcParams 验证#

与线条样式相关的 rcParams( lines.linestyle , boxplot..linestyle , grid.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++ 中实现,这提高了自动放置图例的性能.