I have a simulation which calculates surface data for each iteration of the simulation. I would like to continuously plot that data as a surface plot to the same window (upd
I am grateful for the answer from Paul, although I haven't to tried it out yet.
In the meantime I had found another solution that works and renders with OpenGL using MayaVI, which is OK as I only need real-time quick visual feedback. However I had to install the following packages under Ubuntu: python-enthoughtbase and mayavi2
Here's the code:
import numpy as np
import time
from enthought.mayavi import mlab
from enthought.tvtk.tools import visual
class plot3dClass( object ):
def __init__( self, systemSideLength, lowerCutoffLength ):
self.systemSideLength = systemSideLength
self.lowerCutoffLength = lowerCutoffLength
rangeMax = self.systemSideLength
X = np.arange( 0, self.systemSideLength, self.lowerCutoffLength )
Y = X
matrixSize = int( round( self.systemSideLength / self.lowerCutoffLength ) )
heightR = np.zeros( ( matrixSize, matrixSize ) )
fig = mlab.figure(size=(500,500))
visual.set_viewer(fig)
self.surf = mlab.surf( X, Y, heightR, warp_scale = 1e1 ) # NOTE: the warp_scale factor is relative to the scale of the x- and y-axes
box_extent = ( 0,rangeMax, 0,rangeMax, -1e-7,1e-7 ) # NOTE: the extent options refers to the size and position in the 3D space relative to the origin
mlab.outline(self.surf, color=(0.7, .7, .7), extent = box_extent )
def drawNow( self, heightR ):
self.surf.mlab_source.scalars = heightR
time.sleep(0.033)
This class is not quite where I would like it to be and I have two immediate issues with it:
I will try getting these answered in another thread.
EDIT: Ok. I have just tried the code as suggested by Paul and it also works for me. However, trying it I have become aware that MatPlotLib probably is not the best choice for doing animations in real-time. At least for me it is extremely slow (perhaps only in 3D?).
So in the end I will stick with the MayaVI implementation from above, which except for the two points mentioned, works great.
EDIT: If you go with the MatPlotLib solution, I have found that you can put the line matplotlib.interactive(True) inside the declaration of the plotting class. That way you can have MatPlotLib only defined within the plotting class.