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
相关产品推荐
相关产品推荐

