Matplotlib 3.3.0的新增功能

有关自上次修订以来的所有问题和请求的列表,请参阅 GitHub 统计 .

Table of Contents

图形和轴创建/管理

用于从文本或嵌套列表构成语义轴布局的临时API

这个 Figure 类有一个临时方法来生成复杂的命名网格 axes.Axes 基于嵌套列表输入或ASCII艺术:

axd = plt.figure(constrained_layout=True).subplot_mosaic(
    [['.', 'histx'],
     ['histy', 'scat']]
)
for k, ax in axd.items():
    ax.text(0.5, 0.5, k,
            ha='center', va='center', fontsize=36,
            color='darkgrey')

(Source code _, pngpdf

../_images/whats_new-1.png

或作为字符串(带有单字符轴标签):

axd = plt.figure(constrained_layout=True).subplot_mosaic(
    """
    TTE
    L.E
    """)
for k, ax in axd.items():
    ax.text(0.5, 0.5, k,
            ha='center', va='center', fontsize=36,
            color='darkgrey')

(Source code _, pngpdf

../_images/whats_new-2.png

复杂语义图形构成 更多细节和例子。

GridSpec.subplots()

这个 GridSpec 获得一班 subplots 方法,以便可以写入:

fig.add_gridspec(2, 2, height_ratios=[3, 1]).subplots()

作为替代:

fig.subplots(2, 2, gridspec_kw={"height_ratios": [3, 1]})

新的 Axes.sharexAxes.sharey 方法

这些新方法允许共享轴 立即 在创建它们之后。请注意,如果在创建后没有立即共享轴,则行为是不确定的。

例如,可以使用它们有选择地将使用 subplot_mosaic ::

fig = plt.figure(constrained_layout=True)
axd = fig.subplot_mosaic([['.', 'histx'], ['histy', 'scat']],
                         gridspec_kw={'width_ratios': [1, 7],
                                      'height_ratios': [2, 7]})

axd['histx'].sharex(axd['scat'])
axd['histy'].sharey(axd['scat'])

(Source code _, pngpdf

../_images/whats_new-3.png

紧密布局现在支持supu

以前的版本没有考虑 Figure.suptitle ,因此在调用后可能会与其他艺术家重叠 tight_layout

(Source code _, pngpdf

../_images/whats_new-4.png

从现在开始 suptitle 将考虑:

(Source code _, pngpdf

../_images/whats_new-5.png

设置轴框纵横比

现在可以直接通过 set_box_aspect . 长方体是以物理单位表示的轴高和轴宽之比,与数据限制无关。这有助于,例如,生成独立于其包含的数据的方形图,或在具有固定(数据)纵横比的图像图旁边具有相同轴尺寸的非图像图。

对于用例,请查看 Axes box aspect 例子。

颜色和颜色映射

涡轮彩色地图

Turbo是Google人工智能团队为计算机视觉和机器学习创建的一个改进的彩虹彩色可视化地图。它的目的是显示深度和视差数据。请看照片 Google AI Blog 更多详情。

(Source code _, pngpdf

../_images/whats_new-6.png

colors.BoundaryNorm 支架 延伸 关键字参数

BoundaryNorm 现在有一个 延伸 关键字参数,类似于 延伸 在里面 contourf . 当设置为“both”、“min”或“max”时,它会将相应的超出范围值映射到 Colormap 查找表索引在其范围的适当末端附近,以便超出范围值的颜色与其范围内的邻居相邻,但不同。颜色栏继承 延伸 不符合规范的论点,所以 extend='both' 例如,colorbar将为超出范围的值提供三角形扩展,这些值的颜色与相邻的范围内颜色不同。

(Source code _, pngpdf

../_images/whats_new-7.png

图例标签的文本颜色

现在可以通过传递参数来设置图例标签的文本颜色 labelcolorlegend . 这个 labelcolor 关键字可以是:

  • 单一颜色(字符串或RGBA元组),用于调整所有标签的文本颜色。
  • 一个列表或元组,允许单独设置每个标签的文本颜色。
  • linecolor ,将每个标签的文本颜色设置为与相应的线颜色匹配。
  • markerfacecolor ,将每个标签的文本颜色设置为与相应的标记面颜色匹配。
  • markeredgecolor ,将每个标签的文本颜色设置为与相应的标记边缘颜色匹配。

(Source code _, pngpdf

../_images/whats_new-8.png

Pcolor和Pcolormesh现在接受 shading='nearest''auto'

以前 axes.Axes.pcoloraxes.Axes.pcolormesh 处理的情况 xy 尺寸与 C 通过删除 Cxy 被视为中其余行和列的边 C . 但是,许多用户希望 xy 以行和列为中心 C .

为了适应这种情况, shading='nearest'shading='auto' 是允许的新字符串 阴影 关键字参数。 'nearest' 将颜色集中在 xy 如果 xy 具有与相同的尺寸 C (否则将抛出错误)。 shading='auto' 将根据大小选择“平坦”或“最近” XYC .

如果 shading='flat' 然后 XY 尺寸应大于1 C .如果 XY 具有与相同的尺寸 C ,则使用前面的行为,并使用 C 删除,并发出DeprecationWarning。

用户也可以通过新的 rcParams["pcolor.shading"] (default: 'flat') 在他们 .matplotlibrc 或通过 rcParams .

pcolormesh 举个例子。

标题、记号和标签

将标签与轴边缘对齐

set_xlabelset_ylabelColorbarBase.set_label 支持参数 loc 简化定位。对于xlabel,支持的值为“left”、“center”或“right”。对于ylabel,支持的值为“bottom”、“center”或“top”。

默认值通过 rcParams["xaxis.labelposition"]rcParams["yaxis.labelposition"] ;Colorbar标签根据其方向获取rcParam。

(Source code ()

../_images/whats_new-9_00.png

(png _, pdf

../_images/whats_new-9_01.png

(png _, pdf

允许使用str或函数输入设置记号格式器

set_major_formatterset_minor_formatter 现在接受 str 或功能输入 Formatter 实例。为了一个 strStrMethodFormatter 自动生成并使用。对于函数a FuncFormatter 自动生成并使用。换句话说,::

ax.xaxis.set_major_formatter('{x} km')
ax.xaxis.set_minor_formatter(lambda x, pos: str(x-5))

是的快捷方式:

import matplotlib.ticker as mticker

ax.xaxis.set_major_formatter(mticker.StrMethodFormatter('{x} km'))
ax.xaxis.set_minor_formatter(
    mticker.FuncFormatter(lambda x, pos: str(x-5))

(Source code _, pngpdf

../_images/whats_new-10.png

Axes.set_title 获得 y 用于控制自动定位的关键字参数

set_title 尝试自动定位标题,以避免在顶部x轴上出现任何装饰符。现在这并不总是可取的 y 是的显式关键字参数 set_title . 它默认为 None 这意味着使用自动定位。如果提供了值(即3.0之前的默认值为 y=1.0 )然后关闭自动定位。这也可以用新的参数设置 rcParams["axes.titley"] (default: None) .

(Source code _, pngpdf

../_images/whats_new-111.png

使用时,偏移文字现在设置为顶部 axis.tick_top()

解决了电源指示灯(如1e4)保持在底部的问题,即使刻度在顶部。

设置等高线标签的顺序

clabel 现在接受 Z阶 关键字参数使设置 Z阶 等高线标签。如果未指定,则默认为 Z阶 过去的分类数总是3(即默认值 Z阶 属于 Text )不考虑 Z阶 传递给 contour /轴。轴。轮廓. 新的默认值 Z阶 因为clabels已经改成了 (2 + zorder 传递给 contour / contourf

其他变化

新的 Axes.axline 方法

一个新的 axline 添加了一种方法来绘制通过两点的无限长直线。

fig, ax = plt.subplots()

ax.axline((.1, .1), slope=5, color='C0', label='by slope')
ax.axline((.1, .2), (.8, .7), color='C3', label='by points')

ax.legend()

(Source code _, pngpdf

../_images/whats_new-12.png

imshow 现在将深度为1的三维阵列强制为二维阵列

从这个版本开始,大小为MxNx1的数组将被强制转换成MxN来显示。这意味着像 plt.imshow(np.random.rand(3, 3, 1)) 将不再返回图像形状无效的错误消息。

更好地控制 Axes.pie 标准化

以前, Axes.pie 将其输入标准化 x 如果 sum(x) > 1 ,但如果总和小于1,则不会执行任何操作。这可能会让人困惑,所以一个显式的关键字参数 归一化 已添加。默认情况下,保留旧行为。

旁路 归一化 ,可以显式控制是否进行任何重缩放,或者是否应创建部分派。如果禁用规范化,以及 sum(x) > 1 ,则会引发错误。

(Source code _, pngpdf

../_images/whats_new-13.png

日期使用现代纪元

Matplotlib使用 dates.date2num (通过 matplotlib.units ). 以前,一个 0000-12-31T00:00:00 是为了 0001-01-01 已转换为1.0。过去如此遥远的时代意味着现代日期不能保存微秒,因为2000年乘以64位浮点的2^(-52)分辨率得到14微秒。

在这里,我们将缺省epoch更改为更合理的UNIX缺省值 1970-01-01T00:00:00 在现代,它的分辨率是0.35微秒。(因为我们依赖于 datetime.datetime 日期定位器)。epoch的访问由 get_epoch ,并且有一个新的 rcParams["date.epoch"] (default: '1970-01-01T00:00:00') rcParam.参数。用户也可以呼叫 set_epoch ,但必须设置 之前 使用任何日期转换或打印。

如果数据在旧历元中存储为序数浮点,则可以使用以下公式将其转换为新序数:

new_ordinal = old_ordinal + mdates.date2num(np.datetime64('0000-12-31'))

立即接受行 MarkerStyle 实例作为输入

类似 scatterplotLine2D 现在接受 MarkerStyle 实例作为 标记 参数::

plt.plot(..., marker=matplotlib.markers.MarkerStyle("D"))

字体

按绝对路径选择字体的简单语法

现在可以通过传递绝对值来选择字体 pathlib.Pathfont 的关键字参数 Text .

改进的字重检测

Matplotlib现在能够更好地根据字体的元数据确定字体的权重,从而更准确地区分同一系列中的字体。

rcParams改进

matplotlib.rc_context 可以用作装饰

matplotlib.rc_context 现在可以用作装饰器(从技术上讲,它现在实现为 contextlib.contextmanager ),例如:

@rc_context({"lines.linewidth": 2})
def some_function(...):
    ...

用于控制默认“升起窗口”行为的rcParams

新的配置选项 rcParams["figure.raise_window"] (default: True) 允许在调用 showpause . 这个 MacOSX 当前不支持后端。

添加广义 mathtext.fallback 到rcParams

新的 rcParams["mathtext.fallback"] (default: 'cm') rcParam.参数。使用“cm”、“stix”、“stixsans”或“none”关闭回退。rcParam mathtext.fallback_to_cm 已弃用,但如果使用,将重写新的回退。

添加 contour.linewidth 到rcParams

新的配置选项 rcParams["contour.linewidth"] (default: None) 允许以浮动形式控制等高线的默认线宽。当设置为 None ,线宽将回落到 rcParams["lines.linewidth"] (default: 1.5) . 配置值通常由 线宽度 参数传递给 contour 当它未设置为 None .

三维轴改进

Axes3D 不再扭曲3D打印以匹配2D纵横比

阴谋 Axes3D 以前拉伸过以适合方形边界框。由于这种拉伸是在从3D到2D的投影之后进行的,如果使用非正方形的边界框,则会导致图像失真。从3.3开始,这种情况不再发生。

当前,设置方面的模式(通过 set_aspect )Axes3D不支持在数据空间中,但将来可能会支持。如果要模拟在数据空间中具有相等的纵横比,请将数据限制的比率设置为与 get_box_aspect . 要控制这些比率,请使用 set_box_aspect 方法,将比率接受为X:Y:Z的3元组。默认纵横比为4:4:3。

现在支持三维短轴记号

ax = plt.figure().add_subplot(projection='3d')

ax.scatter([0, 1, 2], [1, 3, 5], [30, 50, 70])

ax.set_xticks([0.25, 0.75, 1.25, 1.75], minor=True)
ax.set_xticklabels(['a', 'b', 'c', 'd'], minor=True)

ax.set_yticks([1.5, 2.5, 3.5, 4.5], minor=True)
ax.set_yticklabels(['A', 'B', 'C', 'D'], minor=True)

ax.set_zticks([35, 45, 55, 65], minor=True)
ax.set_zticklabels([r'$\alpha$', r'$\beta$', r'$\delta$', r'$\gamma$'],
                   minor=True)

ax.tick_params(which='major', color='C0', labelcolor='C0', width=5)
ax.tick_params(which='minor', color='C1', labelcolor='C1', width=3)

(Source code _, pngpdf

../_images/whats_new-14.png

交互式工具改进

跨后端的更一致的工具栏行为

工具栏功能现在在后端更加一致。当某个方向上没有进一步操作时,历史按钮将自动禁用。“平移”和“缩放”按钮在使用时将被标记为活动。

在NbAgg和WebAgg中,工具栏按钮现在以类似于其他后端的方式分组。WebAgg工具栏现在使用与其他后端相同的图标。

工具栏图标现在为深色主题设置样式

在深色主题上,工具栏图标现在将反转。当使用GTK3Agg后端时,工具栏图标现在是符号化的,前景和背景颜色都将跟随主题。工具提示的行为也应该正确。

光标文本现在使用许多与定点精度匹配的有效数字

以前,由光标文本显示的x/y位置通常包含比鼠标指向精度(通常是一个像素)高得多的有效数字。这是现在固定的线性比例。

GTK/Qt缩放矩形现在为黑白

这样即使在黑暗的背景下也能看到。

事件处理程序简化

这个 backend_bases.key_press_handlerbackend_bases.button_press_handler 事件处理程序现在可以直接连接到画布 canvas.mpl_connect("key_press_event", key_press_handler)canvas.mpl_connect("button_press_event", button_press_handler) ,而不必编写填充 帆布工具栏 参数。

用于计算路径大小的函数

各种功能被添加到 BezierSegmentPath 允许计算 Path 以及它的复合贝塞尔曲线。

除了下面的修复之外, BezierSegment 获得了更多的文档和可用性改进,包括包含维度、度、控制点等的属性。

更好的路径段迭代接口

iter_bezier 遍历 BezierSegment 这就是这条路。这通常比现有的 iter_segments 函数,该函数返回重建路径所需的绝对最小信息量。

修正了错误计算路径Bbox的错误

历史上, get_extents 总是简单地返回曲线控制点的Bbox,而不是曲线本身的Bbox。虽然这是路径范围的正确上限,但对于非线性贝塞尔曲线,它可能与路径的实际范围存在显著差异。

后端特定的改进

savefig() 获得了 后端 关键字参数

这个 后端 关键字参数 savefig 现在可以用来选择渲染后端,而不必全局设置后端;例如,可以使用pgf后端保存pdf savefig("file.pdf", backend="pgf") .

SVG后端现在可以透明地渲染图案填充

SVG后端现在尊重图案填充笔划alpha。有用的应用程序,其中之一,半透明图案填充作为一种微妙的方式来区分条形图中的列。

SVG支持更多艺术家的URL

更多艺术家的URL(即 Artist.set_url )现在将保存在SVG文件中,即, Tick S和 Line2D 现在支持。

SVG中的图像在某些查看器中将不再模糊

样式现在提供给没有插值的图像 (imshow(..., interpolation='none' )这样SVG图像查看器在渲染自己时将不再执行插值。

保存SVG现在支持添加元数据

保存SVG文件时,现在可以传递元数据,这些元数据将使用 Dublin CoreRDF . 有效元数据的列表可以在的文档中找到 FigureCanvasSVG.print_svg .

通过PGF保存PDF元数据现在与PDF后端一致

使用PGF后端保存PDF文件时,传递的元数据将以与PDF后端相同的方式进行解释。以前,只有在使用保存多页PDF时,PGF后端才接受此元数据 backend_pgf.PdfPages ,但现在在保存单个数字时也允许。

NbAgg和WebAgg不再使用jQuery&jqueryui

相反,它们是使用香草JavaScript实现的。请报告浏览器的任何问题。