微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 imageio 保存 3D 绘图

如何解决使用 imageio 保存 3D 绘图

我想将 3D 绘图保存为 gif。但是,由于我无法解释的原因,以下代码不起作用。我收到错误消息:Image must be 2D (grayscale,RGB,or RGBA),当我使用 imageio.mimsave(...) 时,但我将图像保存为 RGB:

import numpy as np
import matplotlib.pyplot as plt
import imageio

x = [0,1,0]
y = [0,0]
z = [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()
    image = np.frombuffer(fig.canvas.tostring_rgb(),dtype='uint8')
    images.append(image)
   
imageio.mimsave('test.gif',images)

解决方法

np.frombuffer 返回一个平面数组,其形状为(X*Y*3,),相反 imageio 需要一个 Y × X × 3 (或者对于 RGBA 缓冲区可能是 × 4)。你必须reshape你的image

In [43]: import numpy as np
    ...: import matplotlib.pyplot as plt
    ...: import imageio
    ...: 
    ...: x = [0,1,0]
    ...: y = [0,0]
    ...: z = [0,1]
    ...: 
    ...: fig = plt.figure(figsize=(5,3)) # @100 dpi it's 500×300 pixels
    ...: ax = fig.add_subplot(projection='3d')
    ...: ax.scatter(x,y,z,s=500)
    ...: 
    ...: images = []
    ...: for n in range(0,25):
    ...:     if n >= 15:
    ...:         ax.azim = ax.azim+1.1
    ...:     fig.canvas.draw()
    ...:     image = np.frombuffer(fig.canvas.tostring_rgb(),dtype='uint8')
    ...:     images.append(image.reshape(300,500,3)) ## Y×X
    ...: 
    ...: imageio.mimsave('test.gif',images)
    ...: 

In [44]: ls -l test.gif
-rw-r--r-- 1 boffi boffi 825988 May 21 19:46 test.gif

In [45]: 

enter image description here

请注意,我已经修改了尺寸和帧数以获得更小的 GIF。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。