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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:30:57