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

matplotlib实现曲线与Y轴0值间渐变填充的异常问题求助

问题根因
  • 裁剪多边形构造错误:你传入Polygon的坐标仅包含曲线上的采样点,多边形闭合时会自动连接曲线首尾两点,直接形成了你看到的斜向截断线,填充范围自然无法延伸到y=0位置。
  • 原有注释掉的底部拼接逻辑是延伸到y轴最小值,不符合你要求的y=0基准的填充需求。
  • 额外小问题:原代码中main函数用到的DD变量没有定义,会直接触发运行报错。
解决方法

调整裁剪路径的坐标拼接规则,按「曲线采样点 -> x最大值对应y=0点 -> x最小值对应y=0点」的顺序拼接坐标,形成的封闭区域正好是y=0到曲线之间的范围,正负区间会自动适配。

修正后完整代码
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
from matplotlib.patches import Polygon

# 你原有数据加载逻辑保持不变,此处默认df已经提前读取完成
# 变量定义
AUM = df['#AHD_AUM'].head(104)
MM = df['#AHD_Managed_Money_Net'].head(104)
PRICE = df['#AHD_Price'].head(104)
DATES = df['DATES'].head(104)

# 生成数值型日期序列避免matplotlib解析日期报错
df['count'] = 0
for i in range(len(df['DATES'].head(104))):
    df['count'].iloc[i] = 120 - i

# X/Y数据转换为数组,避免matplotlib不支持日期类型作为数值坐标
x = df['count'].head(104).to_numpy()
y = df['#AHD_Managed_Money_Net'].head(104).to_numpy()

def main():
    # 去掉原错误的循环,直接调用填充函数
    gradient_fill(x,y, fill_color='blue')
    plt.show()

def gradient_fill(x,y, fill_color=None, ax=None, **kwargs):
    """
    渐变填充函数
    """
    if ax is None:
        ax = plt.gca()

    line, = ax.plot(x, y, **kwargs)
    if fill_color is None:
        fill_color = line.get_color()

    zorder = line.get_zorder()
    alpha = line.get_alpha()
    alpha = 1.0 if alpha is None else alpha

    z = np.empty((100, 1, 4), dtype=float)
    rgb = mcolors.colorConverter.to_rgb(fill_color)
    z[:,:,:3] = rgb
    z[:,:,-1] = np.linspace(0, alpha, 100)[:,None]

    xmin, xmax = x.min(), x.max()
    # 渐变图的y范围要覆盖0到曲线的最值
    ymin, ymax = min(y.min(), 0), max(y.max(), 0)
    im = ax.imshow(z, aspect='auto', extent=[xmin, xmax, ymin, ymax],
               origin='lower', zorder=zorder)

    xy = np.column_stack([x, y])
    # 关键修改:拼接y=0的两个端点,形成到基准线的封闭区域
    xy = np.vstack([xy, [xmax, 0], [xmin, 0], [x[0], y[0]]])
    clip_path = Polygon(xy, facecolor='none', edgecolor='none', closed=True)
    ax.add_patch(clip_path)
    im.set_clip_path(clip_path)

    ax.autoscale(True)
    return line, im

main()

内容的提问来源于stack exchange,提问作者jack of all or just jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:15:02