You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Matplotlib置信区间图添加完整图例?

解决Matplotlib中fill_between图例添加的TypeError问题

你遇到的问题根源在于**ax.fill_between()返回的是单个PolyCollection对象,而不是像ax.plot()那样返回包含图形对象的列表**,所以不能使用带逗号的解构赋值(btwn, = ...)来接收它。

错误原因拆解

  • ax.plot()方法会返回一个包含Line2D对象的列表(即使只画一条线),所以可以用prob, = ax.plot(...)来解构取出单个Line2D对象。
  • 但ax.fill_between()直接返回一个PolyCollection实例,不是可迭代的列表,用btwn, = ...会试图对单个对象进行迭代解构,从而触发TypeError: 'PolyCollection' object is not iterable。

修正后的完整代码

只需要去掉fill_between和hlines赋值语句后的逗号,或者直接在绘制元素时添加label参数让Matplotlib自动识别图例:

import matplotlib.pyplot as plt

month = ['Nov-20', 'Dec-20', 'Jan-21', 'Feb-21', 'Mar-21', 'Apr-21', 'May-21', 'Jun-21', 'Jul-21', 'Aug-21', 'Sep-21', 'Oct-21']
x = [0.85704744, 0.74785299, 0.68103776, 0.69793547, 0.8396294 , 0.25560889, 0.37400785, 0.00742866, 0.84700224, 0.95142221, 0.08544432, 0.09068883]
y = [0.09448781, 0.69683102, 0.96261431, 0.93635227, 0.31503366, 0.38335671, 0.24244469, 0.36712811, 0.22270387, 0.01506295, 0.78433 , 0.38408096]
z = [0.84585527, 0.59615266, 0.60263581, 0.26366399, 0.42948978, 0.18138516, 0.54841131, 0.65201558, 0.03089001, 0.20581638, 0.57586628, 0.33622286]

fig, ax = plt.subplots(figsize=(17,8))
# 给折线添加图例标签
prob, = ax.plot(month, z, label="probable forecast")
# 给填充区域添加图例标签,去掉赋值语句后的逗号
btwn = ax.fill_between(month, x, y, color='b', alpha=.3, label="confidence interval")
# 给目标线添加图例标签
tgt = ax.hlines(y=0.50, xmin=0, xmax=(len(month)), colors='orange', linestyles='--', lw=2, label="Target: 50%")

plt.xlabel('Month')
plt.ylabel('Target %')
plt.rcParams["font.size"] = "20"
plt.ylim((0.1, 1.0))
# 直接调用legend即可自动识别所有带label的元素
plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
plt.title("Target Forecast Nov20 - Nov21")
plt.show()
plt.close()

额外优化说明

你也可以完全省去手动收集图形对象的步骤:只要在绘制每个元素时添加label参数,Matplotlib会自动收集所有带标签的图形元素,直接调用plt.legend()就能生成完整图例,代码会更简洁易读。

内容的提问来源于stack exchange,提问作者artemis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:02:36