создание анимации с помощью matplotlib.animation - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь сделать анимированный GIF с помощью matplotlib.Я нашел простой пример здесь: https://tomroelandts.com/articles/how-to-create-animated-gifs-with-python И теперь я пытаюсь адаптировать его к моей проблеме.Ниже приведен код, который я разработал:

from __future__ import division
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from mpl_toolkits.mplot3d import proj3d 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as anim

class AnimatedGif:
    def __init__(self,radius = 10):
        ############################################################
        self.fig = plt.figure(frameon=False,figsize=(12,10))
        self.fig.subplots_adjust(left=0, right=1, bottom=0, top=1)
        ax = Axes3D(self.fig)
        ax.set_xlim((-.7*radius,.7*radius))
        ax.set_ylim((-.7*radius,.7*radius))
        ax.set_zlim((0*radius,1.4*radius))
        ax.axis('off')
        ax.xaxis.pane.set_edgecolor('black')
        ax.yaxis.pane.set_edgecolor('black')
        ax.xaxis.pane.fill = False
        ax.yaxis.pane.fill = False
        ax.zaxis.pane.fill = False
        self.images = []
    ####################################################################
    def add(self,step, area='',azim = 0, elev = 7,color = 'k',numOfLayer = 10,Length = 1.,alpha = 0.8,ids = False):
        from mpl_toolkits.mplot3d import Axes3D
        import matplotlib as mpl
        from mpl_toolkits.mplot3d.art3d import Poly3DCollection
        from mpl_toolkits.mplot3d import proj3d
        ################################################
        ax = self.fig.gca()
        verts = [zip([step*0.5+0.,5,1.,2,1,2],[0.,3,2.,2,1,2],[0.,9,3.,2,1,2])]
        pc = Poly3DCollection(verts,alpha = alpha,linewidths=1, facecolor = color)
        pc.set_edgecolor('k')
        ax.add_collection3d(pc)
        ax.view_init(azim = azim,elev=elev)
        plt_im = ax
        self.images.append([plt_im])
    ####################################################################
    def save(self, filename):
        animation = anim.ArtistAnimation(self.fig, self.images)
        print animation
        animation.save(filename, writer='imagemagick', fps=1)
##################################################################
endStep = 100
stepsize = 5
##################################################################
animated_gif = AnimatedGif()
step = 0 
area = 0 
animated_gif.add(step,area=str(area))
images = []
for step in range(stepsize+1, endStep,stepsize):
    area = 10
    animated_gif.add(step, area=str(area))

animated_gif.save('cell-animated1.gif')

Мне нужно использовать Poly3DCollection, чтобы создать кучу полигонов на 3d, и они перемещаются с временным шагом.Здесь я только что сделал простой случай с многоугольником, перемещающимся по оси X с шагом.Но нет выхода.Вывод просто пустой белый.


Моя путаница в основном возникла из-за отсутствия хороших примеров использования ArtistAnimation.На документация для этого аргумента , artists упоминается как «Каждая запись списка представляет собой коллекцию исполнителей, которые представляют то, что необходимо включить в каждом кадре. Они будут отключены для других кадров.».Однако я не получил то, что точно ожидалось.Я сделал Poly3DCollection, но снова просто передать его, добавив его к self.images, было недостаточно, поскольку его нужно было добавить к axes тоже (ax.add_collection(pc)) в конце.Я решил, что нужно добавить изображения, поэтому попытался добавить pc к collection и добавить ax к self.images, что в итоге было совершенно неверно.

Также большинство ошибок, которые я получил, было:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-1-bd3b8eac5524> in <module>()
     56     animated_gif.add(step, area=str(area))
     57 
---> 58 animated_gif.save('cell-animated1.gif')

<ipython-input-1-bd3b8eac5524> in save(self, filename)
     42         animation = anim.ArtistAnimation(self.fig, self.images)
     43         print animation
---> 44         animation.save(filename, writer='imagemagick', fps=4)
     45 ##################################################################
     46 endStep = 100

/Users/name/anaconda2/lib/python2.7/site-packages/matplotlib/animation.pyc in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs)
   1055                 for anim in all_anim:
   1056                     # Clear the initial frame
-> 1057                     anim._init_draw()
   1058                 for data in zip(*[a.new_saved_frame_seq()
   1059                                   for a in all_anim]):

/Users/name/anaconda2/lib/python2.7/site-packages/matplotlib/animation.pyc in _init_draw(self)
   1374         # Flush the needed figures
   1375         for fig in figs:
-> 1376             fig.canvas.draw_idle()
   1377 
   1378     def _pre_draw(self, framedata, blit):

AttributeError: 'NoneType' object has no attribute 'canvas'

Я не получаю ошибку вообще.Я не мог найти хорошее описание для canvas.Я передавал fig на save, поэтому он не должен быть None.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...