matplotlib.animation 您所在的位置:网站首页 animateion matplotlib.animation

matplotlib.animation

2023-03-21 06:22| 来源: 网络整理| 查看: 265

FuncAnimation#

The inner workings of FuncAnimation is more-or-less:

for d in frames: artists = func(d, *fargs) fig.canvas.draw_idle() fig.canvas.start_event_loop(interval)

with details to handle 'blitting' (to dramatically improve the live performance), to be non-blocking, not repeatedly start/stop the GUI event loop, handle repeats, multiple animated axes, and easily save the animation to a movie file.

'Blitting' is a standard technique in computer graphics. The general gist is to take an existing bit map (in our case a mostly rasterized figure) and then 'blit' one more artist on top. Thus, by managing a saved 'clean' bitmap, we can only re-draw the few artists that are changing at each frame and possibly save significant amounts of time. When we use blitting (by passing blit=True), the core loop of FuncAnimation gets a bit more complicated:

ax = fig.gca() def update_blit(artists): fig.canvas.restore_region(bg_cache) for a in artists: a.axes.draw_artist(a) ax.figure.canvas.blit(ax.bbox) artists = init_func() for a in artists: a.set_animated(True) fig.canvas.draw() bg_cache = fig.canvas.copy_from_bbox(ax.bbox) for f in frames: artists = func(f, *fargs) update_blit(artists) fig.canvas.start_event_loop(interval)

This is of course leaving out many details (such as updating the background when the figure is resized or fully re-drawn). However, this hopefully minimalist example gives a sense of how init_func and func are used inside of FuncAnimation and the theory of how 'blitting' works.

Note

The zorder of artists is not taken into account when 'blitting' because the 'blitted' artists are always drawn on top.

The expected signature on func and init_func is very simple to keep FuncAnimation out of your book keeping and plotting logic, but this means that the callable objects you pass in must know what artists they should be working on. There are several approaches to handling this, of varying complexity and encapsulation. The simplest approach, which works quite well in the case of a script, is to define the artist at a global scope and let Python sort things out. For example:

import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation fig, ax = plt.subplots() xdata, ydata = [], [] ln, = ax.plot([], [], 'ro') def init(): ax.set_xlim(0, 2*np.pi) ax.set_ylim(-1, 1) return ln, def update(frame): xdata.append(frame) ydata.append(np.sin(frame)) ln.set_data(xdata, ydata) return ln, ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128), init_func=init, blit=True) plt.show()

The second method is to use functools.partial to pass arguments to the function:

import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from functools import partial fig, ax = plt.subplots() line1, = ax.plot([], [], 'ro') def init(): ax.set_xlim(0, 2*np.pi) ax.set_ylim(-1, 1) return line1, def update(frame, ln, x, y): x.append(frame) y.append(np.sin(frame)) ln.set_data(x, y) return ln, ani = FuncAnimation( fig, partial(update, ln=line1, x=[], y=[]), frames=np.linspace(0, 2*np.pi, 128), init_func=init, blit=True) plt.show()

A third method is to use closures to build up the required artists and functions. A fourth method is to create a class.

Examples# Decay The Bayes update The double pendulum problem Animated histogram Rain simulation Animated 3D random walk Animated line plot Oscilloscope MATPLOTLIB UNCHAINED


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有