From: Matthew K. G. <mk...@cs...> - 2007-01-13 00:17:53
|
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 |