Source code for foxes.output.animation

import matplotlib.animation as animation


[docs] class Animator: """ Creates an animation from generators that yield lists of artists. Attributes ---------- fig: pyplot.Figure The figure object :group: output """
[docs] def __init__(self, fig=None): """ Constructor. Parameters ---------- fig: pyplot.Figure, optional The figure object """ self.fig = fig self._gens = []
[docs] def add_generator(self, gen): """ Add a generator. Parameters ---------- gen: Generator A generator that yields (fig, list of Artist) """ self._gens.append(gen)
@property def generators(self): """ The artist generators Returns ------- gens: list of generators Generators that yield (fig, list of Artist) """ return self._gens
[docs] def animate(self, verbosity=1, **kwargs): """ Create the animation Parameters ---------- verbostiy: int The verbosity level, 0 = silent kwargs: dict, optional Arguments for pyplot.animation.ArtistAnimation Returns ------- ani: pyplot.animation.ArtistAnimation The animation """ if len(self.generators) == 0: return None if verbosity > 0: print("Creating animation data") si = 0 arts = [] while True: if verbosity > 1: print(f" Frame {si}") harts = [] for g in self.generators: try: y = next(g) if len(y) != 2: raise ValueError( f"Expecting yield (fig, artists) from generator {g}" ) fig, artists = y if self.fig is None: self.fig = fig elif fig is not self.fig: raise ValueError(f"Wrong figure returned by generator {g}") harts += [a for a in artists] except StopIteration: pass if len(harts): arts.append(harts) si += 1 else: break if verbosity > 1: print("Done.") kwa = dict(interval=200, blit=True, repeat_delay=2000) kwa.update(kwargs) ani = animation.ArtistAnimation(fig, arts, **kwa) return ani