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

Matplotlib堆叠图动画报错:'PolyCollection'无'set_data'属性如何解决?

问题描述

将折线图动画改为堆叠图(stackplot)后出现错误:AttributeError: 'PolyCollection' object has no attribute 'set_data'。原代码尝试用set_data更新堆叠图数据,但堆叠图返回的PolyCollection对象不支持该方法,需调整动画更新逻辑。

修复方案

堆叠图的底层是PolyCollection对象,它没有set_data方法,无法像折线图那样直接更新数据。正确做法是在每一帧动画中,先清除当前堆叠图,再重新绘制新的堆叠数据。

以下是修改后的完整代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FFMpegWriter

# 配置ffmpeg路径
plt.rcParams['animation.ffmpeg_path'] = 'C:\\Users\\spsha\\Desktop\\ffmpeg-4.4-full_build\\bin\\ffmpeg.exe'

fig = plt.figure()
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.title('堆叠图动画')

# 调整y轴范围,适配堆叠后的数值叠加效果
plt.xlim(-5, 5)
plt.ylim(-6, 6)

def func(x):
    return np.sin(x)*3

def func2(x):
    return np.cos(x)*3

metadata = dict(title='堆叠图动画', artist='codinglikemad')
writer = FFMpegWriter(fps=15, metadata=metadata)

xlist = []
ylist = []
ylist2 = []

with writer.saving(fig, "stackplot_animation.mp4", 100):
    # 逐帧绘制堆叠图
    for xval in np.linspace(-5, 5, 100):
        xlist.append(xval)
        ylist.append(func(xval))
        ylist2.append(func2(xval))
        
        # 清除当前轴内容,保留坐标轴配置
        plt.gca().clear()
        plt.xlabel('xlabel')
        plt.ylabel('ylabel')
        plt.title('堆叠图动画')
        plt.xlim(-5, 5)
        plt.ylim(-6, 6)
        
        # 重新绘制堆叠图并添加图例
        plt.stackplot(xlist, ylist, ylist2, labels=['sin(x)*3', 'cos(x)*3'])
        plt.legend()
        
        writer.grab_frame()
关键修改说明
  • 移除原代码中无效的折线图对象l, = plt.plot([], []),不再依赖折线图的更新逻辑
  • 调整y轴范围,适配堆叠后两个函数值叠加的显示需求
  • 每一帧循环中,先清除当前轴内容,再重新设置坐标轴标签、范围,最后绘制新的堆叠图
  • 放弃set_data方法,通过重新绘制堆叠图完成帧更新

内容的提问来源于stack exchange,提问作者user25314400

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:10:09