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

如何将循环生成的matplotlib海温热力图批量合成为可循环GIF动图

海表温度可视化绘图生成循环GIF最优实现方案

首选方案:Python全流程生成,无需导出单张图片

直接使用imageio库完成绘图→收集帧→生成GIF的全链路操作,不需要额外导出零散的png图片,也不需要依赖其他外部工具,是目前最简单高效的实现方式。

操作步骤:

  1. 先安装依赖:pip install imageio
  2. 对你原有代码做少量修改即可,修改后的完整代码如下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import imageio

# 提前计算所有年份MHW天数的极值,固定色阶避免每帧色阶跳动
all_meanhw = []
for yyyy in np.arange(1982, 2021):
    year = month_events.loc[(month_events['Year'] == yyyy)]
    meanhw = year.pivot_table(index='Lat', columns='Lon', values='#MHW days', aggfunc=np.mean).values
    all_meanhw.append(meanhw)
vmin = np.min(all_meanhw)
vmax = np.max(all_meanhw)

# 存储GIF帧的列表
gif_frames = []

for yyyy, meanhw in zip(np.arange(1982, 2021), all_meanhw):
    X_unique = month_events.Lat.unique()
    Y_unique = month_events.Lon.unique()
    X, Y = np.meshgrid(Y_unique, X_unique)
    fig = plt.figure(figsize=(10,16), dpi=100)
    ax1_j = fig.add_subplot(111)
    map1 = Basemap(llcrnrlon=289, llcrnrlat=39, urcrnrlon=297, urcrnrlat=45, projection='mill', resolution='h')
    # 这里加了vmin和vmax固定色阶
    a1 = map1.contourf(X, Y, meanhw, latlon=True, cmap='Reds', vmin=vmin, vmax=vmax)
    map1.drawcoastlines(linewidth=0.5)
    map1.fillcontinents(color='lightgray')
    map1.drawstates(linewidth=0.5, color='gray')
    plt.colorbar(a1, ax=ax1_j, fraction=0.0429, pad=0.05, spacing='uniform', label='# days')
    plt.title('Year = %s' % yyyy, size=14, pad=14)
    
    # 把当前画布转为图像数组加入帧列表
    fig.canvas.draw()
    frame = np.array(fig.canvas.renderer.buffer_rgba())
    gif_frames.append(frame)
    # 关闭画布节省内存
    plt.close(fig)

# 生成循环GIF,duration是每帧停留时间(秒),loop=0代表无限循环
imageio.mimsave('海温年变化.gif', gif_frames, duration=0.8, loop=0)

备选方案:已提前导出单张图片的场景

如果你已经把38张图按1982.png、1983.png……2020.png的命名规则存在本地文件夹里了,可以直接读取排序后的图片生成GIF:

import os
import imageio
from PIL import Image

img_dir = './你的图片存储文件夹路径'
# 按年份排序图片
img_list = sorted([os.path.join(img_dir, f) for f in os.listdir(img_dir) if f.endswith('.png')], key=lambda x: int(os.path.basename(x).split('.')[0]))

gif_frames = []
for img_path in img_list:
    gif_frames.append(Image.open(img_path))

# 保存GIF
gif_frames[0].save('海温年变化.gif', save_all=True, append_images=gif_frames[1:], duration=800, loop=0)

优化提示

  • 每帧停留时长可以根据需求调整,单位在imageio里是秒,在PIL的save方法里是毫秒
  • 固定色阶是必须的优化项,否则每帧的colorbar数值范围不同,无法直观看出年际变化
  • 如果需要更高清的GIF,可以在创建plt.figure的时候调大dpi参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:57:01