使用imageio保存matplotlib 3D绘图为GIF时出现Image must be 2D错误如何解决
错误原因
你从画布中读取的RGB数据是一维扁平数组,没有按图像的高、宽、RGB通道三个维度做重构,imageio无法识别该数据为合法的RGB图像格式,因此抛出维度校验错误。
修复代码
import numpy as np import matplotlib.pyplot as plt import imageio x = [0,1,0,0] y = [0,0,1,0] z = [0,0,0,1] fig = plt.figure(figsize=(15,9)) ax = fig.add_subplot(projection='3d') ax.scatter(x,y,z,s=1500) images = [] for n in range(0, 100): if n >= 20: ax.azim = ax.azim+1.1 fig.canvas.draw() # 读取画布RGB数据后重构维度 image = np.frombuffer(fig.canvas.tostring_rgb(), dtype='uint8') # 新增维度重构代码:画布返回宽高为(宽,高),numpy图像维度为(高,宽,通道数),因此要反转宽高顺序 image = image.reshape(fig.canvas.get_width_height()[::-1] + (3,)) images.append(image) # 可添加fps参数控制动图播放帧率 imageio.mimsave('test.gif', images, fps=20)
核心修改说明
- 新增
reshape维度重构逻辑:fig.canvas.get_width_height()会返回画布的(宽度, 高度)像素值,反转后得到numpy图像要求的(高度, 宽度)维度,再加上RGB的3个通道,最终得到合法的三维RGB图像数组 - 可选添加
fps参数到mimsave方法中,自定义动图的播放速度,避免生成的动图播放过快
内容的提问来源于stack exchange,提问作者Physics
相关产品推荐
相关产品推荐

