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

如何制作点数随迭代变化的散点图动画?

实现点数动态变化的散点图动画

当动画每一帧的点数不固定时,直接修改现有散点对象的偏移量(比如3D场景的_offsets3d)会失效,核心解决思路是在每一帧中移除旧散点,重新绘制当前帧的散点集合,以下是2D和3D场景的具体实现:

2D散点图动画示例

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

fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)

# 初始化空变量,用于存储上一帧的散点对象
scatter = None

def update(frame):
    global scatter
    # 清除上一帧的散点(如果存在)
    if scatter is not None:
        scatter.remove()
    # 生成当前帧的随机点数与坐标
    n_points = np.random.randint(5, 50)
    x = np.random.rand(n_points) * 10
    y = np.random.rand(n_points) * 10
    # 绘制当前帧的散点
    scatter = ax.scatter(x, y, c='cornflowerblue', alpha=0.7)
    return scatter,

# 创建动画:20帧,每帧间隔500ms
ani = FuncAnimation(fig, update, frames=20, interval=500, blit=True)
plt.show()

3D散点图动画示例

3D场景下Axes3D.scatter的偏移量属性无法适配点数变化,同样采用逐帧重绘的方式:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_zlim(0, 10)

scatter = None

def update(frame):
    global scatter
    # 清除上一帧散点
    if scatter is not None:
        scatter.remove()
    # 生成当前帧的随机3D坐标与点数
    n_points = np.random.randint(5, 50)
    x = np.random.rand(n_points) * 10
    y = np.random.rand(n_points) * 10
    z = np.random.rand(n_points) * 10
    # 绘制当前帧3D散点
    scatter = ax.scatter(x, y, z, c='tomato', alpha=0.7)
    return scatter,

# 3D动画建议关闭blit,避免渲染异常
ani = FuncAnimation(fig, update, frames=20, interval=500, blit=False)
plt.show()

关键注意事项

  • 必须通过scatter.remove()清除上一帧散点,否则旧散点会堆积在画面中。
  • 3D场景下blit=True容易引发渲染bug,建议设置为False,牺牲少量性能换取显示稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:12:43