I'd like to plot a 3D surface and its contours as the surface evolves. When I do it by simply calling plot_surface and/or contour3D multiple times, the plot doesn't clear the old surface before plotting the new one, so I get a whole bunch of surfaces accumulating in the same plot:

<snip>

import pylab as P

import matplotlib.axes3d as P3

# bad: plots multiple surfaces on top of each other

def animatePlot():

P.ion() fig = P.gcf()

ax3d = P3.Axes3D(self.fig)

for i in xrange(100):

x, y, z = getLatestData(i)

ax3d.plot_surface( x, y, z )

ax3d.contour3D( x, y, z )

P.draw()

</snip>

The one workaround I've found so far is to recreate the entire Axes3D object at each iteration:

<snip>

import pylab as P

import matplotlib.axes3d as P3

# Better: clears previous surface & contours before re-plotting

# Slower.

def animatePlot():

P.ion() fig = P.gcf()

ax3d = P3.Axes3D(self.fig)

for i in xrange(100):

# P.clf() # uncomment to speed up, introduces flicker

self.fig = P.gcf()

self.ax3d = P3.Axes3D(self.fig)

x, y, z = getLatestData(i)

ax3d.plot_surface( x, y, z )

ax3d.contour3D( x, y, z )

P.draw()

</snip>

... but this is significantly slower than the first method. If I uncomment the P.clf() call above, it actually gets faster (??), but there's some unpleasant screen flicker. What's the Right Way to replot a changing surface+contour plot?

Thanks,

-- Matt