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

如何在SageMath与Jupyter中存储循环散点图并制作动画?

解决方案:存储图对象 + 制作自旋动画

一、无需保存文件,存储并调用生成的图

你可以通过将每个Matplotlib图对象存储到列表中,实现后续直接调用特定图,无需保存为图像文件。修改你的代码如下:

import matplotlib.pyplot as plt

# 初始化列表存储所有图对象
plot_list = []
Beta = ellipsis_range(0.05, Ellipsis, 0.8, step=0.05)

for i in range(len(Beta)):
    B = Beta[i]
    j = 0
   
    if B < 0.85:
        # 创建图对象并保存引用
        fig = plt.figure(figsize=(9, 6))
        ax = fig.add_subplot(111)
        
        # 绘制自旋点
        for y in range(1, N+1):
            for x in range(1, N+1):
                if state[j] == 1:
                    ax.scatter(x, y, color="red", marker="^")
                elif state[j] == -1:
                    ax.scatter(x, y, color="blue", marker="v")
                j += 1
        
        ax.set_title(f"Spin Distribution for Beta={round(B, 2)}")
        # 将图对象加入列表
        plot_list.append(fig)
        # 关闭当前图避免自动显示,后续按需调用
        plt.close(fig)

# 后续调用特定图示例:显示第3个图(索引从0开始)
plot_list[2].show()

二、制作自旋分布动画(完全可行)

利用Matplotlib的FuncAnimation模块可以直接生成动画,无需预先保存所有图。建议先把每个Beta对应的自旋状态预存到列表中,再生成动画,效率更高:

from matplotlib.animation import FuncAnimation
from IPython.display import HTML

# 第一步:预存所有Beta对应的自旋状态(替换为你生成state的实际逻辑)
states_list = []
Beta = ellipsis_range(0.05, Ellipsis, 0.8, step=0.05)
for B in Beta:
    # 这里替换成你生成对应Beta值自旋状态的代码
    # 示例:state = your_spin_simulation_function(B, N)
    state = ...  # 你的state生成逻辑
    states_list.append(state)

# 第二步:创建动画
fig, ax = plt.subplots(figsize=(9, 6))
ax.set_xlim(0, N+1)
ax.set_ylim(0, N+1)

def update(frame):
    # 获取当前帧对应的Beta和自旋状态
    current_B = Beta[frame]
    current_state = states_list[frame]
    
    # 清除轴内容,准备绘制当前帧
    ax.clear()
    ax.set_xlim(0, N+1)
    ax.set_ylim(0, N+1)
    
    # 绘制当前自旋分布
    j = 0
    for y in range(1, N+1):
        for x in range(1, N+1):
            if current_state[j] == 1:
                ax.scatter(x, y, color="red", marker="^")
            else:
                ax.scatter(x, y, color="blue", marker="v")
            j += 1
    
    ax.set_title(f"Spin Distribution for Beta={round(current_B, 2)}")
    return ax,

# 生成动画:interval是帧间隔(毫秒),frames是总帧数
ani = FuncAnimation(fig, update, frames=len(Beta), interval=500, blit=False)

# 在Jupyter Notebook中显示动画
HTML(ani.to_jshtml())

# (可选)保存动画到本地
# ani.save("spin_evolution.mp4", writer="ffmpeg")

关键说明:

  • 存储图对象时,用plt.close(fig)避免循环中自动显示所有图,后续通过列表索引直接调用。
  • 动画生成时,FuncAnimation会逐帧调用update函数,自动更新画面;用HTML(ani.to_jshtml())可以在Jupyter中直接渲染动画。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:45:25