Matplotlib 3.3.0 的新特性 (2020年7月16日)#

要查看自上次修订以来的所有问题和拉取请求,请参阅 GitHub 统计数据为 3.9.2 版本(2024年8月12日)

图形和轴的创建 / 管理#

用于从文本或嵌套列表组合语义轴布局的临时API#

Figure 类有一个临时方法,可以根据嵌套列表输入或ASCII艺术生成命名 axes.Axes 的复杂网格:

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, 2x.png, 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, 2x.png, png)

更多详情和示例请参见 复杂且语义化的图形组合 (subplot_mosaic)

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.sharex, Axes.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, 2x.png, png)

tight_layout 现在支持 suptitle#

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

(Source code, 2x.png, png)

从现在开始,将考虑 suptitle

(Source code, 2x.png, png)

设置轴的方框比例#

现在可以通过 set_box_aspect 直接设置轴框的纵横比。轴框的纵横比是轴高度和轴宽度在物理单位中的比例,与数据限制无关。这对于生成一个与数据无关的方形图,或者在具有固定(数据)纵横比的图像图旁边生成具有相同轴尺寸的非图像图非常有用。

有关使用案例,请查看 Axes box aspect 示例。

颜色和颜色映射#

Turbo 色图#

Turbo 是一个用于可视化的改进型彩虹色图,由 Google AI 团队为计算机视觉和机器学习创建。它的目的是显示深度和视差数据。更多详情请参见 Google AI 博客

(Source code, 2x.png, png)

colors.BoundaryNorm 支持 extend 关键字参数#

BoundaryNorm 现在有一个 extend 关键字参数,类似于 contourf 中的 extend。当设置为 'both'、'min' 或 'max' 时,它将相应的超出范围的值映射到 Colormap 查找表索引,这些索引接近其范围的适当端点,以便超出范围的值的颜色与其范围内的邻居相邻,但有所区别。颜色条从规范中继承了 extend 参数,因此例如,使用 extend='both',颜色条将为超出范围的值提供三角形扩展,这些值的颜色与相邻范围内的颜色不同。

(Source code, 2x.png, png)

图例标签的文本颜色#

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

  • 单一颜色(可以是字符串或RGBA元组),用于调整所有标签的文本颜色。

  • 一个列表或元组,允许单独设置每个标签的文本颜色。

  • linecolor 设置每个标签的文本颜色以匹配相应的线条颜色。

  • markerfacecolor,它将每个标签的文本颜色设置为与相应的标记面颜色匹配。

  • markeredgecolor,它将每个标签的文本颜色设置为与相应的标记边缘颜色匹配。

(Source code, 2x.png, png)

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

之前,axes.Axes.pcoloraxes.Axes.pcolormesh 处理 xyC 具有相同(各自)大小的情况时,通过丢弃 C 的最后一行和最后一列,并将 xy 视为 C 中剩余行和列的边缘。然而,许多用户希望 xy 位于 C 的行和列的中心。

为了适应这一点,shading='nearest'shading='auto'shading 关键字参数的新允许字符串。'nearest' 将在 xyC 具有相同维度时将颜色居中(否则将抛出错误)。shading='auto' 将根据 XYC 的大小选择 'flat' 或 'nearest'。

如果 shading='flat',那么 XY 的维度应该比 C 大一。如果 XYC 具有相同的维度,则使用之前的行为,丢弃 C 的最后一行和最后一列,并发出一个 DeprecationWarning。

用户还可以通过新的 rcParams["pcolor.shading"] (default: 'auto') 在其 .matplotlibrc 文件中或通过 rcParams 来指定此项。

参见 pcolormesh 的示例。

标题、刻度和标签#

将标签对齐到轴的边缘#

set_xlabel, set_ylabelColorbarBase.set_label 支持一个 loc 参数用于简化定位。对于 xlabel,支持的值是 'left', 'center', 或 'right'。对于 ylabel,支持的值是 'bottom', 'center', 或 'top'。

默认设置通过 rcParams["xaxis.labelposition"]rcParams["yaxis.labelposition"] 控制;Colorbar 标签根据其方向采用基于 rcParam 的设置。

(Source code)

(2x.png, png)

(2x.png, png)

允许使用字符串或函数输入来设置刻度格式化器#

set_major_formatterset_minor_formatter 现在除了接受 Formatter 实例外,还接受 str 或函数输入。对于 str,会自动生成并使用 StrMethodFormatter。对于函数,会自动生成并使用 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, 2x.png, png)

Axes.set_title 获得了一个 y 关键字参数来控制自动定位#

set_title 尝试自动定位标题以避免顶部 x 轴上的任何装饰器。这并不总是理想的,因此现在 yset_title 的一个显式关键字参数。它默认为 None,这意味着使用自动定位。如果提供了值(即 3.0 之前的默认值是 y=1.0),则自动定位将被关闭。这也可以通过新的 rcParameter rcParams["axes.titley"] (default: None) 来设置。

(Source code, 2x.png, png)

使用 axis.tick_top() 时,