如何为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
相关产品推荐
相关产品推荐

