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

如何创建折线图GIF动画?基于Pandas数据的动态可视化实现

实现动态折线图GIF可视化

现有数据与静态图基础

我有如下结构的Pandas DataFrame:

import pandas as pd

d = {'time': [1, 3, 5,7, 9, 11, 13, 15, 17, 19],
     'method1':[0.864231038, 0.874805716, 0.890315836, 0.906831719, 0.91634293, 0.928120905, 0.938231839, 0.947280697,
              0.951635588, 0.951468784],
    'method2':[0.867868393, 0.878908199, 0.893329853, 0.911470465, 0.924099528, 0.934628044, 0.945209861, 0.951776017,
               0.954180089, 0.95553498]} 

df = pd.DataFrame(data=d)

已通过以下代码绘制静态折线图:

import matplotlib.pyplot as plt
import seaborn as sns

x_labels = df['time']
fig, ax = plt.subplots()
ax.set_xlabel('Time', fontsize=14)
ax.set_ylabel('value', fontsize=14)

sns.lineplot(x=x_labels, y=df['method1'], ax=ax, label='method1')
sns.lineplot(x=x_labels, y=df['method2'], ax=ax, label='method2')
plt.xlim(xmin=0)
ax.set_xlim([1, 19])
plt.legend()
plt.show()

现在需要将数据生成为动态折线图GIF,实现折线逐点绘制、逐步展开的效果。

实现步骤

1. 安装依赖库

确保安装所需的库:

pip install pandas matplotlib seaborn imageio

2. 编写动态GIF生成代码

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import imageio
import os

# 初始化数据
d = {'time': [1, 3, 5,7, 9, 11, 13, 15, 17, 19],
     'method1':[0.864231038, 0.874805716, 0.890315836, 0.906831719, 0.91634293, 0.928120905, 0.938231839, 0.947280697,
              0.951635588, 0.951468784],
    'method2':[0.867868393, 0.878908199, 0.893329853, 0.911470465, 0.924099528, 0.934628044, 0.945209861, 0.951776017,
               0.954180089, 0.95553498]} 

df = pd.DataFrame(data=d)

# 创建临时文件夹存储帧
temp_dir = 'temp_frames'
os.makedirs(temp_dir, exist_ok=True)

# 逐帧绘制并保存
frames = []
for i in range(1, len(df)+1):
    # 初始化画布
    fig, ax = plt.subplots(figsize=(8, 5))
    ax.set_xlabel('Time', fontsize=14)
    ax.set_ylabel('value', fontsize=14)
    ax.set_xlim([1, 19])
    ax.set_ylim([0.85, 0.96])
    
    # 绘制前i个数据点的折线
    sns.lineplot(x=df['time'][:i], y=df['method1'][:i], ax=ax, label='method1', marker='o')
    sns.lineplot(x=df['time'][:i], y=df['method2'][:i], ax=ax, label='method2', marker='s')
    
    ax.legend()
    plt.tight_layout()
    
    # 保存当前帧
    frame_path = os.path.join(temp_dir, f'frame_{i}.png')
    plt.savefig(frame_path)
    frames.append(imageio.imread(frame_path))
    plt.close()

# 生成GIF
imageio.mimsave('dynamic_line_plot.gif', frames, duration=0.5)

# 清理临时文件
for file in os.listdir(temp_dir):
    os.remove(os.path.join(temp_dir, file))
os.rmdir(temp_dir)

代码关键说明

  • 逐帧绘制:通过循环遍历数据行数,每次只绘制前i个数据点,模拟折线逐步展开的效果
  • 帧保存与合成:用imageio读取每帧图片,再通过mimsave合成GIF,duration参数控制每帧停留时间(单位:秒)
  • 样式固定:提前设置好x、y轴的范围,避免动态过程中坐标轴跳动,保证视觉一致性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:05:05