Continuous 3D plotting (i.e. figure update) using python-matplotlib?

前端 未结 3 869
温柔的废话
温柔的废话 2021-01-02 07:20

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

3条回答
  •  谎友^
    谎友^ (楼主)
    2021-01-02 07:45

    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:

    1. After a short will the window is grayed by Ubuntu as (I suppose) Ubuntu thinks the application is not responding. Perhaps rather a an Ubuntu issue, but annoying.
    2. I have been trying to find out how I can be able to rotate the plot with the mouse while animating.

    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.

提交回复
热议问题