plt.fill_between函数label参数失效,如何同时添加折线图与填充区域的图例?
解决Matplotlib中fill_between标签不显示在图例的问题
嘿,我完全懂你的困扰!你遇到的问题核心在于**plt.legend()的调用时机不对**——你在绘制填充区域之前就调用了它,这会导致图例只收集到之前绘制的两条折线的标签,后面的填充区域标签根本没被包含进去。
问题根源
Matplotlib的plt.legend()默认会收集当前已经绘制在轴上的所有带有label参数的元素。你原来的代码顺序是:
- 设置样式、标签、标题
- 调用
plt.legend()——此时只有两条折线存在 - 绘制折线和填充区域
所以填充区域的标签自然不会出现在图例里。
修复后的代码
只需要把plt.legend()移到所有绘图操作(包括plt.fill_between)之后就可以了,修改后的完整代码如下:
import numpy as np import matplotlib.pyplot as plt x = np.arange(25,55,5) y = np.random.randint(10000,50000,6) y2 = np.random.randint(10000,60000,6) plt.style.use('fivethirtyeight') plt.xlabel("some random ages") plt.ylabel('some random salaries') plt.title('whatever') # 先绘制所有元素 plt.plot(x,y, label='first') # 这里把label直接放到plot里,代码更清晰 plt.plot(x,y2, label='second') plt.fill_between(x,y,color = 'blue', alpha = 0.25, where = (y>np.median(y)), interpolate =True, label = 'above median') plt.fill_between(x,y,color = 'red', alpha = 0.25, where = (y<=np.median(y)), interpolate =True, label = 'below median') # 最后调用legend,收集所有标签 plt.legend() plt.show()
额外优化小技巧
你也可以把折线的label直接写在plt.plot()的参数里,这样代码更整洁,不用单独在plt.legend()里传列表——当然两种方式都能生效,只是写法不同。
至于你之前堆叠图遇到的问题,大概率也是同样的原因:在绘制完所有堆叠元素之前就调用了plt.legend(),导致后面的元素标签没被捕获。调整调用顺序就能解决啦!
内容的提问来源于stack exchange,提问作者Aniruddh
相关产品推荐
相关产品推荐

