Matplotlib 3.4.0 的新特性 (2021年3月26日)#
要查看自上次修订以来的所有问题和拉取请求列表,请参阅 GitHub 统计数据为 3.9.2 版本(2024年8月12日)。
图形和轴的创建 / 管理#
新的子图功能#
新的 figure.Figure.add_subfigure 和 figure.Figure.subfigures 功能允许在图形内部创建虚拟图形。类似的嵌套之前是通过嵌套的网格规格(参见 嵌套的网格规格)完成的。然而,这并不允许仅与每个子网格规格相关的局部图形艺术家(例如,颜色条或总标题)。
新的方法 figure.Figure.add_subfigure 和 figure.Figure.subfigures 旨在与 figure.Figure.add_subplot 和 figure.Figure.subplots 押韵,并且具有大多数相同的参数。
更多详情请参见 图子图。
备注
自v3.4起,子图功能是实验性API。
(Source code, 2x.png, png)
subplot_mosaic 的单行字符串表示法#
Figure.subplot_mosaic 和 pyplot.subplot_mosaic 现在接受单行字符串,使用分号来分隔行。即,:
plt.subplot_mosaic(
"""
AB
CC
""")
可以简写为:
plt.subplot_mosaic("AB;CC")
(Source code, 2x.png, png)
Axes 创建方法 (gca, add_axes, add_subplot) 的行为变化#
创建新 Axes 的函数(pyplot.axes、pyplot.subplot、figure.Figure.add_axes、figure.Figure.add_subplot)的行为已更改。过去,这些函数会检测你是否尝试使用与当前 Figure 中已存在的 Axes 相同的参数来创建 Axes,如果是,它们将返回现有的 Axes。现在,pyplot.axes、figure.Figure.add_axes 和 figure.Figure.add_subplot 将始终创建新的 Axes。pyplot.subplot 将继续重用具有匹配子图规格和相等 kwargs 的现有 Axes。
相应地,获取当前 Axes 的函数(pyplot.gca, figure.Figure.gca)的行为已经改变。过去,这些函数接受关键字参数。如果关键字参数与已存在的 Axes 匹配,则返回该 Axes,否则会使用这些关键字参数创建新的 Axes。现在,只有在当前图形中完全没有 Axes 的情况下,才会考虑关键字参数。在未来的版本中,这些函数将完全不接受关键字参数。
add_subplot/add_axes 增加了一个 axes_class 参数#
特别是,mpl_toolkits 的 Axes 子类现在可以通过惯用方式使用,例如 fig.add_subplot(axes_class=mpl_toolkits.axislines.Axes)
Subplot 和 subplot2grid 现在可以与约束布局一起工作#
constrained_layout 依赖于图表上每个逻辑布局的单个 GridSpec。以前,pyplot.subplot 和 pyplot.subplot2grid 每次调用时都会添加一个新的 GridSpec,因此与 constrained_layout 不兼容。
现在 subplot 尝试重用 GridSpec ,如果行数和列数与图表中已有的顶级 GridSpec 相同,即 plt.subplot(2, 1, 2) 将使用与 plt.subplot(2, 1, 1) 相同的 GridSpec,并且 constrained_layout=True 选项将适用于 Figure。
相比之下,混合使用 nrows 和 ncols 将 不会 与 constrained_layout 一起工作:plt.subplot(2, 2, 1) 之后是 plt.subplots(2, 1, 2) 仍将生成两个 GridSpec,并且 constrained_layout=True 将产生不良结果。为了获得所需的效果,第二次调用可以指定第二个 Axes 所覆盖的单元格:plt.subplots(2, 2, (2, 4)),或者可以使用更 Pythonic 的 plt.subplot2grid((2, 2), (0, 1), rowspan=2)。
绘图方法#
axline 支持 transform 参数#
axline 现在支持 transform 参数,该参数应用于点 xy1, xy2。*slope*(如果给出)始终在数据坐标中。
例如,这可以与 ax.transAxes 一起使用来绘制具有固定斜率的线条。在下面的图中,线条穿过两个 Axes 上的同一点,尽管它们显示的数据范围不同。
fig, axs = plt.subplots(1, 2)
for i, ax in enumerate(axs):
ax.axline((0.25, 0), slope=2, transform=ax.transAxes)
ax.set(xlim=(i, i+5), ylim=(i, i+5))
(Source code, 2x.png, png)
新的条形图自动标签#
新增了 Axes.bar_label 方法,用于自动标注条形图。
新自动标签的示例。#
可以为 bar 和 barh 指定一系列的填充样式。#
与某些其他矩形属性类似,现在可以将一系列填充样式传递给 bar 和 barh,以便创建具有不同填充样式的条形图,例如。
(Source code, 2x.png, png)
设置 BarContainer 方向#
BarContainer 现在接受一个新的字符串参数 orientation。它可以是 'vertical' 或 'horizontal',默认是 None。
等高线图现在默认使用 ScalarFormatter#
在等高线绘制调用中传递 fmt="%1.3f" 以恢复旧的默认标签格式。
Axes.errorbar 正确循环非颜色属性#
以前,如果明确指定了颜色,即使属性循环器用于其他属性(如线型),Axes.errorbar 也会错误地跳过 Axes 属性循环。现在,Axes.errorbar 将像 Axes.plot 那样推进 Axes 属性循环,即只要循环器中的所有属性没有被明确传递。
例如,以下将循环遍历线条样式:
x = np.arange(0.1, 4, 0.5)
y = np.exp(-x)
offsets = [0, 1]
plt.rcParams['axes.prop_cycle'] = plt.cycler('linestyle', ['-', '--'])
fig, ax = plt.subplots()
for offset in offsets:
ax.errorbar(x, y + offset, xerr=0.1, yerr=0.3, fmt='tab:blue')
(Source code, 2x.png, png)
errorbar 的 errorevery 参数与 markevery 匹配#
类似于 plot 的 markevery 参数,errorbar 的 errorevery 参数现在接受切片和 NumPy 花式索引(必须与 x 的大小匹配)。
(Source code, 2x.png, png)
hexbin 支持 C 参数的数据引用#
与 x 和 y 参数一样,Axes.hexbin 现在支持使用数据引用传递 C 参数。
data = {
'a': np.random.rand(1000),
'b': np.random.rand(1000),
'c': np.random.rand(1000),
}
fig, ax = plt.subplots()
ax.hexbin('a', 'b', C='c', data=data, gridsize=10)
(Source code, 2x.png, png)
支持用于Sankey标签格式化的可调用对象#
matplotlib.sankey.Sankey 的 format 参数现在可以接受可调用对象。
这允许使用任意函数来标记流,例如允许将数字映射到表情符号。
(Source code, 2x.png, png)
Axes.spines 访问快捷方式#
Axes.spines 现在是一个专用的容器类 Spines ,用于一组 Spine ,而不是 OrderedDict 。除了类似字典的访问方式,Axes.spines 现在还支持一些类似 pandas.Series 的功能。
通过项目或属性访问单个元素:
ax.spines['top'].set_visible(False)
ax.spines.top.set_visible(False)
访问项目子集:
ax.spines[['top', 'right']].set_visible(False)
同时访问所有项目:
ax.spines[:].set_visible(False)
新的 stairs 方法和 StepPatch 艺术家#
pyplot.stairs 和底层艺术家 StepPatch 为绘制阶梯常数函数提供了一个更清晰的接口,适用于你知道阶梯边缘的常见情况。这取代了许多 pyplot.step 的使用场景,例如在绘制 numpy.histogram 的输出时。
对于艺术家和函数,x 类边缘输入比 y 类值输入多一个元素。
(Source code, 2x.png, png)
查看 楼梯演示 获取示例。
为茎图添加了 orientation 参数#
默认情况下,茎线是垂直的。可以通过 Axes.stem 或 pyplot.stem 的 orientation 参数将其更改为水平:
(Source code, 2x.png, png)
括号箭头样式上的角度#
在 Bracket 箭头样式(传递给 FancyArrowPatch 的 arrowstyle 参数的 ]-[、]-、-[ 或 |-|)上指定的角度现在已应用。以前,angleA 和 angleB 选项是允许的,但没有任何作用。
(Source code, 2x.png, png)
TickedStroke 路径效果#
新的 TickedStroke 路径效果可以用来生成带有刻度样式的线条。这可以用于,例如,区分优化解决方案空间中约束边界的有效和无效侧。
颜色和颜色映射#
集合颜色规范与映射#
重新处理颜色映射以及 facecolor 和 edgecolor 的关键字参数,导致了三种行为变化:
可以通过调用
Collection.set_array(None)来关闭颜色映射。之前,这样做不会有任何效果。当设置了一个可映射的数组,并且
facecolor='none'和edgecolor='face',面和边都将保持无色。以前边会被颜色映射。当设置了一个可映射的数组,并且
facecolor='none'和edgecolor='red'时,边缘是红色的。这解决了问题 #1302。之前边缘会被颜色映射。
透明度(alpha)可以作为数组在集合中设置#
之前,控制集合中透明度的alpha值只能指定为一个标量,应用于集合中的所有元素。例如,在 scatter 图中所有的标记,或在 pcolormesh 图中所有的四边形,都将具有相同的alpha值。
现在可以为集合中的每个元素(标记、四边形等)提供一个值的 alpha 数组。
(Source code, 2x.png, png)
pcolormesh 通过启用捕捉功能改进了透明度处理#
由于 snapping 关键字参数是如何传递给 Agg 后端的,Matplotlib 的早期版本在网格边缘之间显示透明网格时,似乎会显示线条。此版本现在默认应用 snapping。要恢复旧的行为(例如,用于测试图像),您可以将 rcParams["pcolormesh.snap"] (default: True) 设置为 False。
(Source code, 2x.png, png)
请注意,主图的网格边界之间有一些线条的透明度不同。当向色图中添加透明度时,颜色条也会显示这些线条,因为内部它使用 pcolormesh 来绘制颜色条。默认情况下启用捕捉(如下),网格边界处的线条会消失。
(Source code, 2x.png, png)
Colormap 对象的 IPython 表示#
matplotlib.colors.Colormap 对象现在为 IPython / Jupyter 后端提供了图像表示。在最后一行返回 colormap 的单元格将显示该 colormap 的图像。
In[1]: cmap = plt.get_cmap('viridis').with_extremes(bad='r', under='g', over='b')
In[2]: cmap
Out[2]:
Colormap.set_extremes 和 Colormap.with_extremes#
由于 Colormap.set_bad, Colormap.set_under 和 Colormap.set_over 方法会就地修改色图,用户在设置极端颜色(例如对于内置色图)时必须小心,首先复制一份色图。
新的 Colormap.with_extremes(bad=..., under=..., over=...) 可以用来首先复制色图,并在该副本上设置极端颜色。
新的 Colormap.set_extremes 方法是为了与 Colormap.with_extremes 保持API对称性而提供的,但请注意,它存在与早期单独设置器相同的问题。
获取 Colormap 对象的浅色/深色/不良颜色#
matplotlib.colors.Colormap 现在有方法 get_under、get_over、get_bad 用于获取超出范围和掩码值的颜色。
新的 cm.unregister_cmap 函数#
matplotlib.cm.unregister_cmap 允许用户移除他们之前注册的色图。
新的 CenteredNorm 用于围绕中心对称的数据#
在数据围绕中心对称的情况下,例如,围绕中心零点的正负异常,CenteredNorm 是一种新的规范,它会自动围绕中心创建对称的映射。这种规范非常适合与发散色图结合使用,发散色图在其中心使用未饱和的颜色。
(Source code, 2x.png, png)
如果对称中心不同于0,可以使用 vcenter 参数进行设置。要手动设置 CenteredNorm 的范围,请使用 halfrange 参数。
有关数据规范化的示例和更多详细信息,请参见 颜色映射归一化。
新的 FuncNorm 用于任意归一化#
.FuncNorm 允许使用函数进行任意正则化,包括正向和反向。
(Source code, 2x.png, png)
有关数据规范化的示例和更多详细信息,请参见 颜色映射归一化。
基于GridSpec的颜色条现在可以放置在主轴的上方或左侧。#
... 通过在 colorbar() 调用中传递 location="top" 或 location="left"。
标题、刻度和标签#
supxlabel 和 supylabel#
可以为整个图形添加 x 和 y 标签,类似于使用新的 Figure.supxlabel 和 Figure.supylabel 方法的 Figure.suptitle。
(Source code, 2x.png, png)
可以向 Axes.plot 传递一个带有标签的可迭代对象#
当通过将2D数据作为 y 值传递给 plot 来绘制多个数据集时,数据集的标签可以作为列表传递,长度与 y 中的列数匹配。
x = [1, 2, 3]
y = [[1, 2],
[2, 5],
[4, 9]]
plt.plot(x, y, label=['low', 'high'])
plt.legend()
(Source code, 2x.png, png)
字体和文本#
文本转换可以旋转文本方向#
新的 Text 参数 transform_rotates_text 现在设置变换的旋转是否影响文本方向。
新 transform_rotates_text 参数的示例#
matplotlib.mathtext 现在支持 overset 和 underset LaTeX 符号#
mathtext 现在支持 overset 和 underset,调用方式为 \overset{annotation}{body} 或 \underset{annotation}{body},其中 annotation 是位于 body 上方或下方的文本。
(Source code, 2x.png, png)
math_fontfamily 参数用于更改 Text 字体族#
新的 math_fontfamily 参数可以用来改变图表中每个单独文本元素的字体系列。如果没有设置参数,将使用全局值 rcParams["mathtext.fontset"] (default: 'dejavusans')。
TextArea/AnchoredText 支持 horizontalalignment#
现在可以在 TextArea 或 AnchoredText 中指定文本的水平对齐方式,这对于多行文本尤其有效:
(Source code, 2x.png, png)
PDF 支持在 Text 艺术家上使用 URL#
text.Text 艺术家上的 URL(即来自 Artist.set_url 的 URL)现在将保存在 PDF 文件中。
rcParams 改进#
日期的新 rcParams:设置转换器以及是否使用间隔倍数#
新的 rcParams["date.converter"] (default: 'auto') 允许使用字符串 'auto' 和 'concise' 分别在 matplotlib.dates.DateConverter 和 matplotlib.dates.ConciseDateConverter 之间切换。
新的 rcParams["date.interval_multiples"] (default: True) 允许在日期定位器尝试在设定的时间间隔(例如,每月的1日和15日)选择刻度,与从时间序列开始处均匀分布的刻度之间进行切换:
dates = np.arange('2001-01-10', '2001-05-23', dtype='datetime64[D]')
y = np.sin(dates.astype(float) / 10)
fig, axs = plt.subplots(nrows=2, constrained_layout=True)
plt.rcParams['date.converter'] = 'concise'
plt.rcParams['date.interval_multiples'] = True
axs[0].plot(dates, y)
plt.rcParams['date.converter'] = 'auto'
plt.rcParams['date.interval_multiples'] = False
axs[1].plot(dates, y)
(Source code, 2x.png, png)
日期格式化器现在遵循 usetex rcParam#
AutoDateFormatter 和 ConciseDateFormatter 现在尊重 rcParams["text.usetex"] (default: False),因此将使用与默认(非日期)格式化器的 TeX 渲染一致的字体。在创建格式化器实例时,也可以通过传递 usetex 参数来启用/禁用 TeX 渲染。
在下图中,x轴(日期)和y轴(数字)现在使用相同的(TeX)字体:
(Source code, 2x.png, png)
将 image.cmap 设置为 Colormap#
现在可以将 rcParams["image.cmap"] (default: 'viridis') 设置为 Colormap 实例,例如使用上述新 set_extremes 创建的色图。(这只能通过 Python 代码完成,不能通过 matplotlibrc 文件完成。)
刻度和刻度标签的颜色可以通过 rcParams 独立设置。#
之前,rcParams["xtick.color"] (default: 'black') 定义了刻度颜色和标签颜色。现在可以使用 rcParams["xtick.labelcolor"] (default: 'inherit') 独立设置标签颜色。它默认值为 'inherit',将从 rcParams["xtick.color"] (default: 'black') 获取值。对于 ytick.[label]color 也是如此。例如,要将刻度设置为浅灰色,将刻度标签设置为黑色,可以在脚本中使用以下代码:
import matplotlib as mpl
mpl.rcParams['xtick.labelcolor'] = 'lightgrey'
mpl.rcParams['xtick.color'] = 'black'
mpl.rcParams['ytick.labelcolor'] = 'lightgrey'
mpl.rcParams['ytick.color'] = 'black'
或者通过在 matplotlibrc 文件或 Matplotlib 样式文件中添加以下行:
xtick.labelcolor : lightgrey
xtick.color : black
ytick.labelcolor : lightgrey
ytick.color : black
3D 轴改进#
3D Axes 中的 Errorbar 方法#
错误条函数 Axes.errorbar 已完全移植到 3D Axes 框架中,支持自定义错误线的样式和帽标记、控制错误条间距、上下限标记等功能。
3D 坐标轴中的茎图#
茎图现在在3D坐标轴上得到支持。与2D茎图类似,stem 支持以各种方向绘制茎图:
(Source code, 2x.png, png)
另请参阅 3D 茎 演示。
3D 集合属性现在可以修改#
之前,用于3D效果的3D集合的属性(例如,颜色被修改以产生深度阴影)在创建后无法更改。
现在可以随时修改3D集合的所有属性。
在3D坐标轴中平移#
点击并拖动鼠标中键以平移 3D 坐标轴。
交互工具改进#
新的 RangeSlider 小部件#
widgets.RangeSlider 允许创建一个定义范围而不是单个值的滑块。
(Source code, 2x.png, png)
滑块现在可以吸附到任意值#
Slider UI 小部件现在接受 valstep 的数组。这通过允许滑块捕捉到任意值来概括了之前的行为。
暂停和恢复动画#
animation.Animation.pause 和 animation.Animation.resume 方法允许你暂停和恢复动画。这些方法可以作为UI元素上事件监听器的回调函数使用,以便你的图表可以有一些播放控制UI。
Sphinx 扩展#
plot_directive caption 选项#
在使用 plot_directive 指令并指定外部源文件时,之前支持添加标题:
.. plot:: path/to/plot.py
This is the caption for the plot.
:caption: 选项允许为外部指定标题。
.. plot:: path/to/plot.py
:caption: This is the caption for the plot.
以及内联图表:
.. plot::
:caption: This is a caption for the plot.
plt.plot([1, 2, 3])
特定后端的改进#
连续的光栅化绘制现在已合并#
向量输出的元素可以通过 rasterized 关键字参数或 set_rasterized() 单独设置为栅格化。这有助于减小文件大小。对于具有多个栅格元素的图形,它们现在会自动合并到较少数量的位图中,而不会影响视觉效果。在元素较多的情况下,这可以显著减小文件大小。
为了确保这一点,不要在光栅元素之间放置矢量元素。
要抑制这种合并,请将 Figure.suppressComposite 设置为 True。
在 FFMpegFileWriter 中支持原始/RGBA帧格式#
使用 FFMpegFileWriter 时,frame_format 现在可以设置为 "raw" 或 "rgba",这可能比图像格式稍快,因为 Matplotlib 和 FFmpeg 之间不需要进行编码/解码。
nbAgg/WebAgg 支持中键点击和双击#
nbAgg 和 WebAgg 后端现在支持双击事件。以前,WebAgg 会将中键点击事件报告为右键点击,但现在会报告正确的按钮类型。
nbAgg 支持二进制通信#
如果网络浏览器和笔记本支持二进制 websockets,nbAgg 现在将使用它们来略微改进图形显示的传输。
在可能的情况下,PDF 文件中 PNG 图像的索引颜色#
当 PNG 图像的颜色数为 256 或更少时,它们在保存为 PDF 之前会被转换为索引颜色。在某些情况下,这可以显著减小文件大小。这对于使用颜色映射但没有插值的光栅数据尤其如此,例如 Healpy mollview 图。目前,这仅适用于 RGB 图像。
改进了PDF/PS中的字体子设置#
PDF 和 PostScript 中的字体子集化已从嵌入的 ttconv C 代码重写为 Python。一些复合字符和轮廓可能略有变化。这修复了 PDF 中的 ttc 子集化,并增加了对 type 3 OTF 字体子集化的支持,从而生成更小的文件(使用中日韩字体时文件更小),并避免了与 type 42 嵌入和某些 PDF 阅读器(如 Acrobat Reader)相关的问题。
在PDF中的字符串添加了字距调整#
与在 Agg 后端生成的文本一样(参见 上一篇新功能条目 中的示例),PDF 现在在文本字符串中包含字距调整。
在 QtAgg 中完全支持 HiDPI#
在Qt 5.14中添加了完全分数的HiDPI(即,不是整数的HiDPI比率),现在在使用此版本或更新版本的Qt时,QtAgg后端支持此功能。
wxAgg 支持全屏切换#
wxAgg 后端支持使用 f 快捷键或管理器函数 FigureManagerBase.full_screen_toggle 切换全屏。