Matplotlib 3.3.0 中的新功能 (2020 年 7 月 16 日)#
有关自上次修订以来的所有问题和 pull request 的列表,请参阅 3.10.0 的 GitHub 统计信息 (2024 年 12 月 13 日) .
Figure 和 Axes 的创建/管理#
用于从文本或嵌套列表组合语义轴布局的临时 API#
Figure 类有一个临时方法,可以基于嵌套列表输入或 ASCII art 生成命名的 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, png)
或者作为字符串(带有单字符 Axes 标签):
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, 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]})
tight_layout 现在支持 suptitle#
以前的版本没有考虑 Figure.suptitle ,因此在调用 tight_layout 后,它可能会与其他艺术家重叠:
(Source code, png)
从现在开始, suptitle 将被考虑在内:
(Source code, png)
设置坐标轴框体纵横比#
现在可以直接通过 set_box_aspect 设置坐标轴框体的纵横比.框体纵横比是坐标轴高度与坐标轴宽度在物理单位上的比率,与数据限制无关.这对于生成一个正方形图非常有用(例如,与它包含的数据无关),或者使非图像图与具有固定(数据)纵横比的图像图具有相同的轴尺寸.
有关用例,请查看 Axes box aspect 示例.
颜色和颜色映射#
Turbo 颜色映射#
Turbo 是一种改进的彩虹颜色映射,用于可视化,由 Google AI 团队为计算机视觉和机器学习创建.它的目的是显示深度和视差数据. 请参阅 Google AI Blog 以获取更多详细信息.
(Source code, png)
colors.BoundaryNorm 支持 extend 关键字参数#
BoundaryNorm 现在有一个 extend 关键字参数,类似于 contourf 中的 extend. 当设置为 'both','min' 或 'max' 时,它将相应的超出范围的值映射到 Colormap 查找表中,其索引接近其范围的相应端,以便超出范围的值的颜色与相邻的范围内颜色相邻但又不同. 颜色条从 norm 继承 extend 参数,因此,例如,使用 extend='both' ,颜色条将具有超出范围值的三角形扩展,其颜色与相邻的范围内颜色不同.
(Source code, png)
图例标签的文本颜色#
现在可以通过向 legend 传递参数 labelcolor 来设置图例标签的文本颜色. labelcolor 关键字可以是:
单个颜色(字符串或 RGBA 元组),用于调整所有标签的文本颜色.
列表或元组,允许单独设置每个标签的文本颜色.
linecolor,它将每个标签的文本颜色设置为与相应的线条颜色匹配.markerfacecolor,它将每个标签的文本颜色设置为与相应的标记面颜色匹配.markeredgecolor,它将每个标签的文本颜色设置为与相应的标记边缘颜色匹配.
(Source code, png)
Pcolor 和 Pcolormesh 现在接受 shading='nearest' 和 'auto'#
以前, axes.Axes.pcolor 和 axes.Axes.pcolormesh 通过删除 C 的最后一行和最后一列来处理 x 和 y 与 C 具有相同(各自的)大小的情况,并且 x 和 y 被视为 C 中剩余行和列的边缘.但是,许多用户希望 x 和 y 位于 C 的行和列的中心.
为了适应这一点, shading='nearest' 和 shading='auto' 是 shading 关键字参数的新允许字符串.如果 x 和 y 与 C 具有相同的维度,则 'nearest' 将颜色置于 x 和 y 的中心(否则将抛出错误). shading='auto' 将根据 X,Y,C 的大小选择 'flat' 或 'nearest'.
如果 shading='flat' ,则 X 和 Y 的维度应比 C 大 1.如果 X 和 Y 与 C 具有相同的维度,则使用之前的行为,并删除 C 的最后一行和最后一列,并发出 DeprecationWarning.
用户还可以通过其 .matplotlibrc 中的新 rcParams["pcolor.shading"] (default: 'auto') 或通过 rcParams 来指定这一点.
有关示例,请参见 pcolormesh .
标题,刻度和标签#
将标签与轴边缘对齐#
set_xlabel , set_ylabel 和 ColorbarBase.set_label 支持参数 loc 以简化定位.对于 xlabel,支持的值为"left","center"或"right".对于 ylabel,支持的值为"bottom","center"或"top".
默认值通过 rcParams["xaxis.labellocation"] (default: 'center') 和 rcParams["yaxis.labellocation"] (default: 'center') 控制;Colorbar 标签根据其方向采用 rcParam.
允许使用 str 或函数输入设置刻度格式化程序#
set_major_formatter 和 set_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, png)
Axes.set_title 获得了一个 y 关键字参数来控制自动定位#
set_title 尝试自动定位标题以避免顶部 x 轴上的任何装饰.这并不总是理想的,所以现在 y 是 set_title 的一个显式关键字参数.它默认为 None,这意味着使用自动定位.如果提供了一个值(即,3.0 之前的默认值是 y=1.0 ),那么自动定位将被关闭.这也可以通过新的 rc 参数 rcParams["axes.titley"] (default: None) 来设置.
(Source code, png)
当使用 axis.tick_top() 时,偏移文本现在被设置到顶部#
解决了即使刻度位于顶部,功率指示器(例如,1e4)仍然位于底部的问题.
设置等高线标签的 zorder#
clabel 现在接受一个 zorder 关键字参数,使其更容易设置等高线标签的 zorder.如果未指定,则 clabel 的默认 zorder 过去总是 3(即 Text 的默认 zorder),而不管传递给 contour / contourf 的 zorder.clabel 的新默认 zorder 已更改为(传递给 contour / contourf 的 2 + zorder ).
其他更改#
新的 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, png)
imshow 现在将深度为 1 的 3D 数组强制转换为 2D 数组#
从这个版本开始,大小为 MxNx1 的数组将被强制转换为 MxN 以进行显示.这意味着像 plt.imshow(np.random.rand(3, 3, 1)) 这样的命令将不再返回图像形状无效的错误消息.
更好地控制 Axes.pie 归一化#
以前,如果 sum(x) > 1 , Axes.pie 会对其输入 x 进行归一化,但如果总和小于 1,则不会执行任何操作.这可能会令人困惑,因此添加了一个显式的关键字参数 normalize.默认情况下,保留旧的行为.
通过传递 normalize,可以显式控制是否进行任何重新缩放,或者是否应创建部分饼图.如果禁用归一化,并且 sum(x) > 1 ,则会引发错误.
(Source code, png)
日期使用现代纪元#
Matplotlib 使用 dates.date2num (通过 matplotlib.units )将日期转换为自纪元以来的天数.以前,使用 0000-12-31T00:00:00 的纪元,因此 0001-01-01 被转换为 1.0.过去如此遥远的纪元意味着现代日期无法保留微秒,因为 2000 年乘以 64 位浮点数的 2^(-52) 分辨率得到 14 微秒.
在这里,我们将默认纪元更改为更合理的 UNIX 默认值 1970-01-01T00:00:00 ,对于现代日期,它具有 0.35 微秒的分辨率.(不可能有更高的分辨率,因为我们依赖 datetime.datetime 来确定日期定位器).可以通过 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 实例作为输入#
类似于 scatter , plot 和 Line2D 现在接受 MarkerStyle 实例作为 marker 参数的输入:
plt.plot(..., marker=matplotlib.markers.MarkerStyle("D"))
字体#
通过绝对路径选择字体的简单语法#
现在可以通过将绝对 pathlib.Path 传递给 Text 的 font 关键字参数来选择字体.
改进的字体粗细检测#
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) 允许在调用 show 或 pause 时禁用提升绘图窗口.目前不支持 MacOSX 后端.
向 rcParams 添加广义的 mathtext.fallback#
新的 rcParams["mathtext.fallback"] (default: 'cm') rcParam.接受 "cm","stix","stixsans" 或 "none" 以关闭回退. rcParam mathtext.fallback_to_cm 已弃用,但如果使用,将覆盖新的回退.
向 rcParams 添加 contour.linewidth#
新的配置选项 rcParams["contour.linewidth"] (default: None) 允许控制轮廓的默认线宽,类型为浮点数. 当设置为 None 时,线宽将回退到 rcParams["lines.linewidth"] (default: 1.5) . 当 linewidths 参数传递给 contour 且未设置为 None 时,该配置值将像往常一样被覆盖.
3D 轴改进#
Axes3D 不再扭曲 3D 绘图以匹配 2D 纵横比#
先前,使用 Axes3D 制作的绘图被拉伸以适合正方形边界框. 由于这种拉伸是在从 3D 到 2D 的投影之后完成的,因此如果使用非正方形边界框,则会导致图像失真. 从 3.3 开始,不再发生这种情况.
目前,Axes3D 不支持在数据空间中设置纵横比的模式(通过 set_aspect ),但将来可能会支持. 如果您想模拟在数据空间中具有相等的纵横比,请设置您的数据限制的比率以匹配 get_box_aspect 的值. 要控制这些比率,请使用 set_box_aspect 方法,该方法接受 X:Y:Z 的 3 元组作为比率. 默认纵横比为 4:4:3.
3D 轴现在支持小刻度#
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, png)
交互式工具改进#
跨后端的更一致的工具栏行为#
工具栏功能现在在各个后端之间更加一致. 历史记录按钮将在某个方向上没有进一步操作时自动禁用. 平移和缩放按钮在使用时将被标记为活动状态.
在 NbAgg 和 WebAgg 中,工具栏按钮现在与其它后端类似地分组. WebAgg 工具栏现在使用与其它后端相同的图标.
工具栏图标现在针对暗黑主题进行了样式设置#
在暗黑主题上,工具栏图标现在将被反转. 使用 GTK3Agg 后端时,工具栏图标现在是符号化的,并且前景色和背景色都将遵循主题. 工具提示也应该表现正确.
光标文本现在使用与指向精度匹配的有效位数#
以前,光标文本显示的 x/y 位置通常包括比鼠标指向精度(通常为一个像素)多得多的有效位数. 现在已针对线性比例修复了此问题.
GTK / Qt 缩放矩形现在为黑白#
这使其即使在深色背景下也可见.
事件处理程序的简化#
backend_bases.key_press_handler 和 backend_bases.button_press_handler 事件处理程序现在可以直接连接到画布,使用 canvas.mpl_connect("key_press_event", key_press_handler) 和 canvas.mpl_connect("button_press_event", button_press_handler) ,而无需编写填充(现在是可选的)画布和工具栏参数的包装函数.
计算 Path 大小的函数#
向 BezierSegment 和 Path 添加了各种函数,以允许计算 Path 及其复合贝塞尔曲线的形状/大小.
除了下面的修复之外, BezierSegment 还获得了更多的文档和可用性改进,包括包含其维度,阶数,control_points 等的属性.
Path 段迭代的更好接口#
iter_bezier 迭代构成 Path 的 BezierSegment .这通常比现有的 iter_segments 函数更有用,后者返回重建 Path 所需的绝对最少的信息.
修复了错误计算 Path 的 Bbox 的错误#
从历史上看, get_extents 总是简单地返回曲线控制点的 Bbox,而不是曲线本身的 Bbox.虽然这是路径范围的正确上限,但对于非线性贝塞尔曲线,它可能与 Path 的实际范围有很大差异.
后端特定的改进#
savefig() 获得了 backend 关键字参数#
savefig 的 backend 关键字参数现在可用于选择渲染后端,而无需全局设置后端;例如,可以使用 pgf 后端保存 PDF,方法是 savefig("file.pdf", backend="pgf") .
SVG 后端现在可以渲染具有透明度的阴影线#
SVG 后端现在尊重阴影线笔画的 alpha.有用的应用程序包括,半透明阴影线,作为区分条形图中列的微妙方式.
SVG 支持更多艺术家的 URL#
更多艺术家(即,来自 Artist.set_url )的 URL 现在将保存在 SVG 文件中,即,现在支持 Tick 和 Line2D .
SVG 中的图像在某些查看器中将不再模糊#
现在为没有插值的图像提供样式( imshow(..., interpolation='none' ),以便 SVG 图像查看器在渲染自身时不再执行插值.
保存 SVG 现在支持添加元数据#
保存 SVG 文件时,现在可以传递元数据,这些元数据将使用 Dublin Core 和 RDF 保存在文件中.有效元数据的列表可以在 FigureCanvasSVG.print_svg 的文档中找到.
通过 PGF 保存 PDF 元数据现在与 PDF 后端一致#
使用 PGF 后端保存 PDF 文件时,传递的元数据的解释方式与 PDF 后端相同.以前,仅当使用 backend_pgf.PdfPages 保存多页 PDF 时,PGF 后端才接受此元数据,但现在也允许在保存单个图形时使用.
NbAgg 和 WebAgg 不再使用 jQuery 和 jQuery UI#
相反,它们是使用原生 JavaScript 实现的.请报告浏览器的任何问题.