如何将循环生成的matplotlib海温热力图批量合成为可循环GIF动图
海表温度可视化绘图生成循环GIF最优实现方案
首选方案:Python全流程生成,无需导出单张图片
直接使用imageio库完成绘图→收集帧→生成GIF的全链路操作,不需要额外导出零散的png图片,也不需要依赖其他外部工具,是目前最简单高效的实现方式。
操作步骤:
- 先安装依赖:
pip install imageio - 对你原有代码做少量修改即可,修改后的完整代码如下:
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
相关产品推荐
相关产品推荐

