Animate Contourf with only new frames

Firstly I would like to apologize in case this should belong in the matplotlib-users, I’m not sure if this is dev or users related.

Let us say we want to animate a 2D contour plot, then passing the blit = True argument to FuncAnimation fails since the QuadContourSet has no axes attribute.

Is it for some specific it is implemented like this? And maybe there a hack to get this to work?

A working code example with the actually wanted one commented out.

import numpy as np
import matplotlib.animation as animation
from matplotlib import pyplot as plt

fig, ax = plt.subplots()

x = np.linspace( -np.pi, np.pi, 50 )
y = np.linspace( -np.pi, np.pi, 50 )
X, Y = np.meshgrid( x, y )
Z = np.zeros( X.shape )

def init():
cont = ax.contourf( X, Y, Z )
cbar = plt.colorbar( cont )
return cont,

def animate( t ):
k = np.array( [1,1] )
omega = 0.5

x = np.linspace( -np.pi, np.pi, 50 )
y = np.linspace( -np.pi, np.pi, 50 )
X, Y = np.meshgrid( x, y )
Z = np.exp( 1j * (omega* t - X*k[0] ) ) * np.exp( - 1j * k[1]*Y )
cont = ax.contourf( X, Y, Z )
return cont,

#ani = animation.FuncAnimation( fig, animate, frames = 100, interval = 1, repeat = False, blit = True, init_func = init,)
ani = animation.FuncAnimation( fig, animate, frames = 100, interval = 1, repeat = False, init_func = init,)
plt.show()

Huh, how about that. ContourSet subclasses ScalarMappable, but not Artist. I don’t know if that is intentional or not, but given that most plotting functions return artists, this would seem to be an anomaly. FuncAnimation expects a list of Artists. Since QuadContourSet is (apparently) not an Artist, then that is why it isn’t working quite right.

As for blitting, I doubt you are going to need it here. Blitting is really only advantagous if the computation/draw time of the animated portion is comparable to the computation/draw time of the unanimated portion. Contouring tends to be time-consuming (relatively speaking), so I doubt you will gain much benefit from blitting it.

Ben Root

···

On Mon, Feb 23, 2015 at 8:53 AM, Ignat Harczuk <ignathe@…149…> wrote:

Firstly I would like to apologize in case this should belong in the matplotlib-users, I’m not sure if this is dev or users related.

Let us say we want to animate a 2D contour plot, then passing the blit = True argument to FuncAnimation fails since the QuadContourSet has no axes attribute.

Is it for some specific it is implemented like this? And maybe there a hack to get this to work?

A working code example with the actually wanted one commented out.

import numpy as np
import matplotlib.animation as animation
from matplotlib import pyplot as plt

fig, ax = plt.subplots()

x = np.linspace( -np.pi, np.pi, 50 )
y = np.linspace( -np.pi, np.pi, 50 )
X, Y = np.meshgrid( x, y )
Z = np.zeros( X.shape )

def init():
cont = ax.contourf( X, Y, Z )
cbar = plt.colorbar( cont )
return cont,

def animate( t ):
k = np.array( [1,1] )
omega = 0.5

x = np.linspace( -np.pi, np.pi, 50 )
y = np.linspace( -np.pi, np.pi, 50 )
X, Y = np.meshgrid( x, y )
Z = np.exp( 1j * (omega* t - X*k[0] ) ) * np.exp( - 1j * k[1]*Y )
cont = ax.contourf( X, Y, Z )
return cont,

#ani = animation.FuncAnimation( fig, animate, frames = 100, interval = 1, repeat = False, blit = True, init_func = init,)
ani = animation.FuncAnimation( fig, animate, frames = 100, interval = 1, repeat = False, init_func = init,)
plt.show()


Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server

from Actuate! Instantly Supercharge Your Business Reports and Dashboards

with Interactivity, Sharing, Native Excel Exports, App Integration & more

Get technology previously reserved for billion-dollar corporations, FREE

http://pubads.g.doubleclick.net/gampad/clk?id=190641631&iu=/4140/ostg.clktrk


Matplotlib-devel mailing list

Matplotlib-devel@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-devel