如何在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
相关产品推荐
相关产品推荐

