Matplotlib 3.7.0 新特性 (2023年2月13日)#
有关自上次修订以来的所有问题和拉取请求列表,请参阅 GitHub 3.11.0 版本统计信息 (2026年6月11日)。
绘图和注释改进#
饼图的 hatch 参数#
pie 现在接受一个 hatch 关键字,该关键字可输入一个填充图案或填充图案列表
fig, (ax1, ax2) = plt.subplots(ncols=2)
x = [10, 30, 60]
ax1.pie(x, hatch=['.', 'o', 'O'])
ax2.pie(x, hatch='.O')
ax1.set_title("hatch=['.', 'o', 'O']")
ax2.set_title("hatch='.O'")
极坐标图的误差线以极坐标系绘制#
在极坐标图上绘制误差线时,上限和误差线现在相对于极坐标进行绘制。
bar_label 中的额外格式字符串选项#
bar_label 的 fmt 参数现在接受 {}-风格的格式字符串
import matplotlib.pyplot as plt
fruit_names = ['Coffee', 'Salted Caramel', 'Pistachio']
fruit_counts = [4000, 2000, 7000]
fig, ax = plt.subplots()
bar_container = ax.bar(fruit_names, fruit_counts)
ax.set(ylabel='pints sold', title='Gelato sales by flavor', ylim=(0, 8000))
ax.bar_label(bar_container, fmt='{:,.0f}')
它也接受可调用对象
animal_names = ['Lion', 'Gazelle', 'Cheetah']
mph_speed = [50, 60, 75]
fig, ax = plt.subplots()
bar_container = ax.bar(animal_names, mph_speed)
ax.set(ylabel='speed in MPH', title='Running speeds', ylim=(0, 80))
ax.bar_label(
bar_container, fmt=lambda x: '{:.1f} km/h'.format(x * 1.61)
)
用于注释的 ellipse boxstyle 选项#
boxstyle 的 'ellipse' 选项现在可用于创建具有椭圆形轮廓的注释。对于较长的文本,它可以作为闭合曲线形状使用,以替代可能会变得非常大的 'circle' boxstyle。
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(5, 5))
t = ax.text(0.5, 0.5, "elliptical box",
ha="center", size=15,
bbox=dict(boxstyle="ellipse,pad=0.3"))
imshow 的 extent 现在可以使用单位表示#
imshow 和 set_extent 的 extent 参数现在可以使用单位表示。
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(layout='constrained')
date_first = np.datetime64('2020-01-01', 'D')
date_last = np.datetime64('2020-01-11', 'D')
arr = [[i+j for i in range(10)] for j in range(10)]
ax.imshow(arr, origin='lower', extent=[0, 10, date_first, date_last])
plt.show()
图例条目的顺序反转#
现在可以通过向 legend 传递 reverse=True 来反转图例条目的顺序。
pcolormesh 支持 RGB(A) 颜色#
pcolormesh 方法现在可以处理使用 RGB(A) 值指定的显式颜色。要指定颜色,数组必须是形状为 (M, N, [3, 4]) 的 3D 数组。
import matplotlib.pyplot as plt
import numpy as np
colors = np.linspace(0, 1, 90).reshape((5, 6, 3))
plt.pcolormesh(colors)
plt.show()
查看刻度、刻度标签和网格线的当前外观设置#
新的 get_tick_params 方法可用于获取将应用于添加到绘图中的任何额外刻度、刻度标签和网格线的外观设置。
>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ax.yaxis.set_tick_params(labelsize=30, labelcolor='red',
... direction='out', which='major')
>>> ax.yaxis.get_tick_params(which='major')
{'direction': 'out',
'left': True,
'right': False,
'labelleft': True,
'labelright': False,
'gridOn': False,
'labelsize': 30,
'labelcolor': 'red'}
>>> ax.yaxis.get_tick_params(which='minor')
{'left': True,
'right': False,
'labelleft': True,
'labelright': False,
'gridOn': False}
可以从第三方包导入样式文件#
第三方包现在可以分发全局可用的样式文件,具体方式如下。假设一个包可以像 import mypackage 那样导入,并且包含一个 mypackage/__init__.py 模块。那么 mypackage/presentation.mplstyle 样式表就可以用 plt.style.use("mypackage.presentation") 来调用。
该实现实际上并不会导入 mypackage,这使得该过程对于可能的导入时副作用是安全的。同时也支持子包(例如 dotted.package.name)。
3D 绘图改进#
用于在 3D 中设置等轴纵横比的 adjustable 关键字参数#
在为 3D 图设置等轴纵横比时,用户可以选择修改数据限制或边界框,以与 2D 坐标轴保持一致。
import matplotlib.pyplot as plt
import numpy as np
from itertools import combinations, product
aspects = ('auto', 'equal', 'equalxy', 'equalyz', 'equalxz')
fig, axs = plt.subplots(1, len(aspects), subplot_kw={'projection': '3d'},
figsize=(12, 6))
# Draw rectangular cuboid with side lengths [4, 3, 5]
r = [0, 1]
scale = np.array([4, 3, 5])
pts = combinations(np.array(list(product(r, r, r))), 2)
for start, end in pts:
if np.sum(np.abs(start - end)) == r[1] - r[0]:
for ax in axs:
ax.plot3D(*zip(start*scale, end*scale), color='C0')
# Set the aspect ratios
for i, ax in enumerate(axs):
ax.set_aspect(aspects[i], adjustable='datalim')
# Alternatively: ax.set_aspect(aspects[i], adjustable='box')
# which will change the box aspect ratio instead of axis data limits.
ax.set_title(f"set_aspect('{aspects[i]}')")
plt.show()
Poly3DCollection 支持阴影#
现在可以对 Poly3DCollection 进行阴影处理。如果多边形是从例如 3D 模型中获得的,这将非常有用。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
# Define 3D shape
block = np.array([
[[1, 1, 0],
[1, 0, 0],
[0, 1, 0]],
[[1, 1, 0],
[1, 1, 1],
[1, 0, 0]],
[[1, 1, 0],
[1, 1, 1],
[0, 1, 0]],
[[1, 0, 0],
[1, 1, 1],
[0, 1, 0]]
])
ax = plt.subplot(projection='3d')
pc = Poly3DCollection(block, facecolors='b', shade=True)
ax.add_collection(pc)
plt.show()
用于 3D 面板颜色的 rcParam#
rcParams rcParams["axes3d.xaxis.panecolor"] (默认: (0.95, 0.95, 0.95, 0.5)), rcParams["axes3d.yaxis.panecolor"] (默认: (0.9, 0.9, 0.9, 0.5)), rcParams["axes3d.zaxis.panecolor"] (默认: (0.925, 0.925, 0.925, 0.5)) 可用于更改 3D 绘图中背景面板的颜色。请注意,给它们提供略有不同的色调以获得“3D效果”并使其稍微透明 (alpha < 1) 通常是有益的。
import matplotlib.pyplot as plt
with plt.rc_context({'axes3d.xaxis.panecolor': (0.9, 0.0, 0.0, 0.5),
'axes3d.yaxis.panecolor': (0.7, 0.0, 0.0, 0.5),
'axes3d.zaxis.panecolor': (0.8, 0.0, 0.0, 0.5)}):
fig = plt.figure()
fig.add_subplot(projection='3d')
图表和坐标轴布局#
colorbar 现在具有 location 关键字参数#
colorbar 方法现在支持 location 关键字参数,以便更轻松地放置色标。当使用 cax 关键字参数提供自己的插图轴时,此功能非常有用,且其行为类似于未提供轴的情况(此时 location 关键字会被传递)。不再需要 orientation 和 ticklocation,因为它们是由 location 决定的。如果不想使用自动设置,仍然可以提供 ticklocation。(也可以提供 orientation,但必须与 location 兼容。)
示例为
import matplotlib.pyplot as plt
import numpy as np
rng = np.random.default_rng(19680801)
imdata = rng.random((10, 10))
fig, ax = plt.subplots(layout='constrained')
im = ax.imshow(imdata)
fig.colorbar(im, cax=ax.inset_axes([0, 1.05, 1, 0.05]),
location='top')
使用 constrained_layout 可以将图例放置在图表外部#
如果通过以字符串 "outside" 开头的 loc 关键字参数指定图例,constrained_layout 将为图表图例留出空间。这些代码与坐标轴代码不同,例如 "outside upper right" 将在图表的顶部为图例留出空间,而 "outside right upper" 则会在图表的右侧留出空间。详情请参阅 图例指南。
subplot_mosaic 中的子图专属关键字参数#
现在可以将关键字参数传递给 Figure.subplot_mosaic 和 pyplot.subplot_mosaic 中对 add_subplot 的每个特定调用,从而创建坐标轴。
fig, axd = plt.subplot_mosaic(
"AB;CD",
per_subplot_kw={
"A": {"projection": "polar"},
("C", "D"): {"xscale": "log"},
"B": {"projection": "3d"},
},
)
这对于创建具有混合投影的马赛克特别有用,但可以传递任何关键字参数。
subplot_mosaic 不再是临时特性#
Figure.subplot_mosaic 和 pyplot.subplot_mosaic 的 API 现在被认为是稳定的,并将遵循 Matplotlib 的正常弃用流程进行变更。
控件改进#
其他改进#
图表钩子#
新的 rcParams["figure.hooks"] (默认: []) 提供了一种在 pyplot 图表上注册任意自定义的机制;它是一组字符串列表,格式为 "dotted.module.name:dotted.callable.name",用于指定在 pyplot.figure 创建的每个图表上调用的函数;这些函数可以例如附加回调或修改工具栏。请参阅 mplcvd -- 图表钩子示例 了解工具栏自定义的示例。