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

Matplotlib两条水平线阈值间填充颜色失败,求代码排查

问题排查与修正方案

核心问题分析

  1. 重复创建Axes对象:先后两次赋值ax,第一次的fig.add_subplot(111)被后续的lacebita['Prob'].plot()覆盖,导致画布设置混乱。
  2. fill_between参数逻辑错误:当前代码试图填充0到曲线值且曲线值小于30的区域,和你要的两条阈值线间填充需求不符。
  3. 轴设置语法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:10:28