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

plt.fill_between函数label参数失效,如何同时添加折线图与填充区域的图例?

解决Matplotlib中fill_between标签不显示在图例的问题

嘿,我完全懂你的困扰!你遇到的问题核心在于**plt.legend()的调用时机不对**——你在绘制填充区域之前就调用了它,这会导致图例只收集到之前绘制的两条折线的标签,后面的填充区域标签根本没被包含进去。

问题根源

Matplotlib的plt.legend()默认会收集当前已经绘制在轴上的所有带有label参数的元素。你原来的代码顺序是:

  1. 设置样式、标签、标题
  2. 调用plt.legend()——此时只有两条折线存在
  3. 绘制折线和填充区域

所以填充区域的标签自然不会出现在图例里。

修复后的代码

只需要把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:24:09