使用PillowWriter制作(sin)^3动画触发shape mismatch报错如何解决
报错根因
触发该维度不匹配错误的直接原因是调用set_data更新线条坐标时,传入的x、y序列长度不一致:
- 你预先定义的
x_axis是固定长度为48000的全量x坐标数组(从-12到12步长0.0005,总计48000个采样点) - 循环过程中
y_axis是逐点追加的:第1次循环长度为1,第2次循环长度为2,直到最后一次循环才会增长到48000
每次执行l.set_data(x_axis, y_axis)时,两个参数长度差会导致matplotlib无法完成坐标点的一一匹配,触发广播错误,你看到的报错信息里arg 1 with shape (2,)就是程序跑到第2次循环时,y_axis的实际长度。
除此之外原代码还有两个影响使用的问题:
- x轴采样步长0.0005过小,总帧数达48000,按20fps计算生成的gif时长可达40分钟,渲染耗时极长且完全没有必要
- y轴范围设置为-12到12过大,
3sin³(x)的值域仅为[-3,3],动画显示的曲线会过于窄小
修复方案
- 更新线条数据时,不要传入全量
x_axis,只截取和当前y_axis长度一致的x坐标切片,保证x、y序列长度完全匹配 - 调大x轴采样步长,将总帧数控制在200-300区间,兼顾动画流畅度和渲染速度
- 调整y轴显示范围到[-4,4],让曲线显示更饱满
修复后可直接运行的代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import PillowWriter def calc_y(x): return 3 * np.sin(x)**3 fig = plt.figure() curve_line, = plt.plot([], [], 'g-', linewidth=2) plt.xlim(-12, 12) plt.ylim(-4, 4) plt.grid(alpha=0.3) plt.xlabel('x') plt.ylabel('y = 3sin³(x)') metadata = dict(title="3[sin(x)]^3", artist="Me") writer = PillowWriter(fps=20, metadata=metadata) # 采样步长调整为0.1,总计240帧,20fps下动画时长12秒,流畅无卡顿 x_axis = np.arange(-12, 12, 0.1) y_record = [] with writer.saving(fig, "sin_cubed_animation.gif", 100): for x_val in x_axis: y_record.append(calc_y(x_val)) # 传入等长的x、y序列,避免形状不匹配 curve_line.set_data(x_axis[:len(y_record)], y_record) writer.grab_frame()
运行后即可生成曲线从左到右逐步绘制的gif动画。
内容的提问来源于stack exchange,提问作者senku ishigami
相关产品推荐
相关产品推荐

