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

使用Makie生成动态散点图GIF的技术实现问题

解决Makie批量生成散点图GIF的问题

问题根源

你之前的代码之所以只显示第一张图,是因为在record循环里重新创建了新的fig对象,但录制流程从始至终绑定的都是最开始传入的初始fig,新生成的fig根本没被纳入录制范围。

方案一:基于预计算的数据数组生成GIF

这种方式适合先算完所有数据,再逐帧更新绘图内容,无需反复创建新的fig:

using CairoMakie
using ImageMagick

# 预计算全部数据
xs = [ [i for i in 1:j] for j in 1:10 ]
ys = [ [1 for i in 1:j] for j in 1:10 ]

# 创建初始绘图框架,获取散点对象
fig = Figure()
ax = Axis(fig[1,1])
scat = scatter!(ax, xs[1], ys[1])

# 提前设置轴范围,避免每帧自动缩放导致画面跳动(可选)
xlims!(ax, 0, 10)
ylims!(ax, 0, 2)

# 录制GIF:直接更新散点数据而非重建fig
record(fig, "data_based.gif", 1:10; framerate=5) do t
    scat[1] = xs[t]  # 更新x轴数据
    scat[2] = ys[t]  # 更新y轴数据
end

核心注意点:

  • 只创建一次fig和scat对象
  • 通过scat[1]、scat[2]直接修改散点的x、y数据,实现画面更新
  • 固定轴范围能让动画过渡更平滑

方案二:基于预先生成的绘图数组生成GIF

如果已经提前批量生成了所有完整的fig对象,可以通过导出图片再合成的方式制作GIF:

using CairoMakie
using ImageMagick

# 预计算数据并生成所有绘图对象
xs = [ [i for i in 1:j] for j in 1:10 ]
ys = [ [1 for i in 1:j] for j in 1:10 ]
figs = [Figure() do fig
            ax = Axis(fig[1,1])
            scatter!(ax, xs[t], ys[t])
            xlims!(ax, 0,10)
            ylims!(ax,0,2)
        end for t in 1:10]

# 将每个fig导出为临时png文件
temp_files = [tempname() * ".png" for _ in 1:10]
for (i, fig) in enumerate(figs)
    save(temp_files[i], fig)
end

# 用ImageMagick合成GIF,-delay单位为1/100秒,200对应5帧/秒
run(`convert -delay 200 $(temp_files) plot_array.gif`)

# 清理临时文件(可选)
for f in temp_files
    rm(f)
end

核心注意点:

  • 先把所有fig对象批量生成并存入数组
  • 将每个fig导出为png格式的临时文件
  • 借助ImageMagick的convert命令合成GIF,通过-delay参数控制帧间隔
  • 记得清理临时文件避免冗余

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 11:27:11