循环更新mayavi图

时间:2016-10-03 21:24:05

标签: python interactive mayavi

我想要做的是在循环中更新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(),则会窃取焦点,并且不允许代码继续。

我觉得我应该使用的是 traits 图(例如this)。我可以按照示例traits应用程序运行一个在更新滑块时实时更新的图形。但是,当我的代码要求更新时,我无法更新它;现在关注的焦点是“被偷走”。 visualization.configure_traits()

任何指针或指向相应文档的链接都将不胜感激。

修改

大卫温彻斯特的回答更接近解决方案。

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

2 个答案:

答案 0 :(得分:2)

我瘦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()

我使用这篇文章作为参考(Animating a mayavi points3d plot

答案 1 :(得分:1)

如果您使用wx后端,如果您想在某些长时间运行的功能中与您的数据进行交互,则可以定期调用wx.Yield()。在下面的示例中,wx.Yield()在某些&#34;长时间运行&#34;的每次迭代中被调用。功能,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)