Matplotlib两条水平线阈值间填充颜色失败,求代码排查
问题排查与修正方案
核心问题分析
- 重复创建Axes对象:先后两次赋值
ax,第一次的fig.add_subplot(111)被后续的lacebita['Prob'].plot()覆盖,导致画布设置混乱。 - fill_between参数逻辑错误:当前代码试图填充0到曲线值且曲线值小于30的区域,和你要的两条阈值线间填充需求不符。
- 轴设置语法错误:
set_ylim(0, 100, 10)参数格式错误,且重复设置x轴范围导致冲突。
修正后的完整代码
import matplotlib.pyplot as plt import numpy as np # 假设lacebita是已加载的目标DataFrame fig, ax = plt.subplots(figsize=(15, 7)) xtime = np.linspace(1990, 2021, 384) # 绘制主曲线 ax.plot(xtime, lacebita['Prob'], 'black', alpha=1.0, linewidth=2, label='Deciles') # 填充33阈值线以下的区域(匹配目标图效果) ax.fill_between(xtime, 0, 33, color='red', alpha=0.75, zorder=0) # 绘制两条阈值水平线 ax.axhline(50, linestyle='--', color='black', label='Percentile 50') ax.axhline(33, linestyle='--', color='orange', label='Percentile 33') # 设置轴范围与刻度 ax.set_xlim(lacebita.index.min(), lacebita.index.max()) ax.set_ylim(0, 100) ax.set_yticks(np.arange(0, 101, 10)) # 设置y轴刻度间隔为10 plt.grid(True) plt.legend(loc="upper left") ax.set_title('Deciles para 12-Meses La Cebita(1990-2020)', fontsize=16) plt.savefig('deciles_12_lacebita.jpg') plt.show()
关键修正点说明
- 统一Axes创建:用
plt.subplots一次性生成画布和轴对象,避免重复赋值冲突。 - 正确填充区域:
fill_between(xtime, 0, 33)直接填充0到33阈值线之间的整个区域,zorder=0确保填充层在曲线和网格下方,不遮挡内容。如果需要仅填充曲线低于33的部分,可替换为:ax.fill_between(xtime, lacebita['Prob'], 33, where=(lacebita['Prob'] < 33), color='red', alpha=0.75) - 修正轴设置:移除重复的x轴范围设置,用
set_yticks替代错误的set_ylim参数,实现y轴刻度间隔为10的需求。
内容的提问来源于stack exchange,提问作者Juan Carlos
相关产品推荐
相关产品推荐

