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

如何用Python基于时空二维数组制作动态动画图?

实现时空二维数组的动画展示

我生成了一个包含时间维度和空间维度的二维数组,想针对每个时间步绘制对应空间维度的数组并实现动画效果。目前的代码只能输出第0时间步的空间数据图像,希望把后续时间步的数据在同一图中以动画形式展示,求实现示例。

当前代码:

import numpy as np
import matplotlib.pyplot as plt

i = 10 #time-step
j = 20 #space-step

z = np.random.rand(i,j) #2D space-time array 
x = np.arange(0, j, 1) #space axis


plt.figure()
plt.plot(x,z[0,:], '.') #plotting space axis at time-step = 0

可行,以下是两种实现方式

方法一:使用FuncAnimation(推荐)

这是matplotlib官方推荐的动画实现方案,效率更高、运行更流畅,适合大多数场景。

完整代码:

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

# 初始化参数
time_steps = 10
space_steps = 20

# 生成时空二维数组
z = np.random.rand(time_steps, space_steps)
x = np.arange(0, space_steps, 1)

# 创建画布和轴对象
fig, ax = plt.subplots()
# 初始化第一个时间步的绘图标记
points, = ax.plot(x, z[0, :], '.', markersize=10)
# 固定轴范围,避免动画过程中轴频繁缩放
ax.set_xlim(0, space_steps - 1)
ax.set_ylim(z.min() - 0.1, z.max() + 0.1)
ax.set_xlabel('空间维度')
ax.set_ylabel('数值')
ax.set_title('时空数组动画展示')

# 定义每帧的更新函数
def update(frame):
    # 更新当前时间步的数值
    points.set_ydata(z[frame, :])
    # 更新标题显示当前时间步
    ax.set_title(f'时空数组动画展示 (时间步: {frame})')
    return points, ax.title

# 创建动画实例
ani = FuncAnimation(
    fig, update, frames=time_steps, interval=500, blit=True
)

# 显示动画
plt.show()

# 若需保存动画,可取消下方注释(需提前安装ffmpeg或pillow)
# ani.save('space_time_animation.mp4', writer='ffmpeg', fps=2)
# ani.save('space_time_animation.gif', writer='pillow', fps=2)

关键说明:

  • frames参数指定总时间步数,动画会遍历从0到time_steps-1的所有时间步
  • interval控制每帧间隔(单位:毫秒),这里设置为500即每秒2帧
  • blit=True仅更新画面中变化的部分,大幅提升动画流畅度
  • 提前固定轴范围可以避免画面抖动,提升观感

方法二:循环更新绘图(快速测试用)

如果只是快速验证效果,也可以用循环+暂停的方式实现,代码更直观:

import numpy as np
import matplotlib.pyplot as plt

time_steps = 10
space_steps = 20

z = np.random.rand(time_steps, space_steps)
x = np.arange(0, space_steps, 1)

fig, ax = plt.subplots()
ax.set_xlim(0, space_steps - 1)
ax.set_ylim(z.min() - 0.1, z.max() + 0.1)
ax.set_xlabel('空间维度')
ax.set_ylabel('数值')

# 遍历每个时间步更新画面
for t in range(time_steps):
    ax.clear()  # 清除当前轴内容
    ax.plot(x, z[t, :], '.', markersize=10)  # 绘制当前时间步的数据
    ax.set_title(f'时间步: {t}')
    plt.pause(0.5)  # 暂停0.5秒,让画面更新
    plt.draw()  # 刷新画布

plt.show()

关键说明:

  • 每次循环先清除轴内容,再重新绘制当前时间步的数据
  • plt.pause(0.5)控制每帧的间隔时间
  • 这种方法实现简单,但效率低于FuncAnimation,适合小数据量的快速测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:12:23