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

如何用for循环制作Matplotlib动画?图形重叠问题求助

Matplotlib动画图形重叠问题修复及实现方案

原代码的核心问题

  • 每次循环重复绘制饱和曲线和动态曲线,导致图形不断叠加出现重叠
  • FuncAnimation 使用错误,未传入正确的帧更新函数,直接传入了绘图对象
  • 静态元素(坐标轴标签、刻度、饱和曲线)被重复初始化,造成冗余

修正思路

  1. 分离静态与动态元素:饱和曲线、坐标轴设置、标签等静态内容只初始化一次,无需每次帧更新重复绘制
  2. 用更新函数驱动动画:FuncAnimation 的核心是通过更新函数逐帧修改动态元素数据,而非重复创建新图形
  3. 预存动态数据:提前提取所有帧的动态点数据,方便更新函数快速调用

修正后的代码

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,提问作者후니훈

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:50:21