Matplotlib中‘将mappable添加到Axes’的含义解析
关于Matplotlib警告中“将mappable添加到Axes”的解释
问题根源
你提供的示例代码里,手动创建了ScalarMappable对象sm,仅用它生成颜色值给折线,但这个sm从未和任何Axes(绘图区域)绑定。当调用plt.colorbar(sm)时,Matplotlib无法确定该从哪个Axes旁边分配色条的空间,只能临时用当前默认Axes(gca()),这就是警告的由来。
“将mappable添加到Axes”的含义
这句话的核心是:让你手动创建的mappable对象(比如示例里的ScalarMappable)与某个具体的Axes建立关联,这样Matplotlib就能明确知道色条应该依附在哪个绘图区域旁边,无需再猜测。
具体实现(结合你的示例修改)
要完成这个绑定,需要两步关键操作:
- 给
ScalarMappable设置一个空数组(Matplotlib内部要求mappable必须有array属性,即使是空的); - 将这个mappable对象添加到目标Axes中。
修改后的代码如下:
import matplotlib.pyplot as plt from matplotlib.cm import ScalarMappable import numpy as np x = np.linspace(0, 1, 201) # 显式创建画布和Axes对象,替代默认的plt.gca() fig, ax = plt.subplots() sm = ScalarMappable(norm=plt.Normalize(0.5, 4.5), cmap='cool_r') sm.set_array([]) # 必须:给mappable设置空数组,满足内部属性要求 ax.add_artist(sm) # 将mappable添加到指定Axes,建立关联 for i in range(4): ax.plot(x, x+(1-x)*np.sin(np.pi*i*x), color=sm.to_rgba(i+1)) # 现在Matplotlib能从sm找到关联的ax,无需额外指定ax参数(指定也可以) cb = plt.colorbar(sm) cb.set_ticks((1,2,3,4)) plt.tight_layout() plt.show()
补充说明
平时我们用plt.imshow()、plt.contourf()等函数时,它们返回的mappable对象(比如AxesImage)会自动和绘制它们的Axes绑定,所以调用colorbar()时不会出现这个警告。只有像你这样手动创建独立的ScalarMappable时,才需要手动完成绑定操作。
内容的提问来源于stack exchange,提问作者gboffi
相关产品推荐
相关产品推荐

