如何用for循环制作Matplotlib动画?图形重叠问题求助
Matplotlib动画图形重叠问题修复及实现方案
原代码的核心问题
- 每次循环重复绘制饱和曲线和动态曲线,导致图形不断叠加出现重叠
FuncAnimation使用错误,未传入正确的帧更新函数,直接传入了绘图对象- 静态元素(坐标轴标签、刻度、饱和曲线)被重复初始化,造成冗余
修正思路
- 分离静态与动态元素:饱和曲线、坐标轴设置、标签等静态内容只初始化一次,无需每次帧更新重复绘制
- 用更新函数驱动动画:
FuncAnimation的核心是通过更新函数逐帧修改动态元素数据,而非重复创建新图形 - 预存动态数据:提前提取所有帧的动态点数据,方便更新函数快速调用
修正后的代码
import pandas as pd import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 读取数据(注意路径前加r避免转义问题) df = pd.read_excel(r'D:\python\221027_phdiagram.xlsx', sheet_name=3) df_sat = pd.read_excel(r'D:\python\221027_phdiagram.xlsx', sheet_name=2) # 预提取所有帧的动态数据 frames_data = [] for st in range(0, 3600, 600): # 批量提取当前帧的x、y值 x_vals = [df.loc[st, col] for col in ['h1', 'h2', 'h3', 'h6', 'h7', 'h8']] y_vals = [df.loc[st, col] for col in ['P1', 'P2', 'P3', 'P6', 'P7', 'P8']] frames_data.append((x_vals, y_vals)) # 初始化画布与静态元素 fig, ax = plt.subplots() ax.set_yscale('log', base=10) ax.set_xlabel('Enthalpy') ax.set_ylabel('Pressure') ax.set_xticks([140, 200, 260, 320, 380, 440, 500, 560]) ax.set_yticks([0.5, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50]) # 绘制静态饱和曲线(仅执行一次) sat_y = df_sat.loc[3:1203, 'pbar'] sat_liq_x = df_sat.loc[3:1203, 'hliquid'] sat_vap_x = df_sat.loc[3:1203, 'hvapor'] ax.plot(sat_liq_x, sat_y, color='b') ax.plot(sat_vap_x, sat_y, color='b') # 初始化动态曲线(空对象,后续通过update函数更新数据) line, = ax.plot([], [], marker='o', color='r') # 定义帧更新函数:每帧修改动态曲线的坐标数据 def update(frame): x, y = frames_data[frame] line.set_data(x, y) return line, # 创建动画:frames为预存数据的长度,blit=True优化渲染速度 ani = FuncAnimation(fig, update, frames=len(frames_data), interval=50, blit=True) plt.show()
关键说明
- 预存动态数据避免了在动画更新时重复读取Excel,提升运行效率
- 静态元素只绘制一次,彻底解决图形重叠问题
blit=True让动画只更新变化的部分,大幅提升流畅度
内容的提问来源于stack exchange,提问作者후니훈
相关产品推荐
相关产品推荐

