在循环中更新mayavi plot



我想做的是在循环中更新一个mayavi图。我希望在我指定的时间完成情节的更新(不像动画装饰器)。

我想运行的一个示例代码是:

import time
import numpy as np
from mayavi import mlab
V = np.random.randn(20, 20, 20)
s = mlab.contour3d(V, contours=[0])
for i in range(5):
    time.sleep(1) # Here I'll be computing a new V
    V = np.random.randn(20, 20, 20)
    # Update the plot with the new information
    s.mlab_source.set(scalars=V)

然而,这并不显示一个数字。如果我在循环中包含mlab.show(),那么这就会窃取焦点,并且不允许代码继续。

我觉得我应该使用的是一个特征图形(例如这个)。我可以遵循示例特征应用程序来运行一个图形,当我更新滑块时实时更新。然而,当我的代码要求它更新时,我不能让它更新;现在的焦点被visualization.configure_traits()"偷走"了。

如有任何指示或适当文档的链接,将不胜感激。


编辑

David Winchester的答案离解决方案更近了一步。

然而,正如我在评论中指出的那样,在time.sleep()步骤期间,我无法用鼠标操纵图形。在这一步骤中,在整个程序中,计算机将忙于计算v的新值。在此期间,我希望能够操纵图形,用鼠标旋转它等。

我认为Mayavi使用generators动画数据。这是为我工作:

import time
import numpy as np
from mayavi import mlab
f = mlab.figure()
V = np.random.randn(20, 20, 20)
s = mlab.contour3d(V, contours=[0])
@mlab.animate(delay=10)
def anim():
    i = 0
    while i < 5:
        time.sleep(1)
        s.mlab_source.set(scalars=np.random.randn(20, 20, 20))
        i += 1
        yield
anim()

我用这篇文章作为参考(动画mayavi points3d情节)

如果使用wx后端,如果希望在一些长时间运行的函数期间与数据交互,则可以定期调用wx.Yield()。在下面的例子中,wx.Yield()在每次迭代某个"长时间运行"的函数animate_sleep时被调用。在本例中,您可以使用$ ipython --gui=wx <program_name.py>

启动程序
import time
import numpy as np
from mayavi import mlab
import wx
V = np.random.randn(20, 20, 20)
f = mlab.figure()
s = mlab.contour3d(V, contours=[0])
def animate_sleep(x):
    n_steps = int(x / 0.01)
    for i in range(n_steps):
        time.sleep(0.01)
        wx.Yield()
for i in range(5):
    animate_sleep(1)
    V = np.random.randn(20, 20, 20)
    # Update the plot with the new information
    s.mlab_source.set(scalars=V)

相关内容

  • 没有找到相关文章

最新更新