更新mayavi阴谋循环
我想要做的是更新循环中的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()
,那么这会窃取焦点并且不允许代码继续。
我觉得我应该使用的是性状数字(例如this)。我可以按照示例特征应用程序来运行更新滑块时实时更新的图形。但是,当我的代码要求更新时,我无法更新它;现在的焦点是visualization.configure_traits()
'被盗'。
任何指针或适当的文档链接,将不胜感激。
编辑
大卫·温彻斯特的回答变得更近了一步,以解决方案。
但是,正如我在评论中指出的那样,我无法在time.sleep()
步骤中用鼠标操作图形。正是在这一步中,在完整的程序中,计算机将忙于计算V的新值。在此期间,我希望能够操纵该数字,用鼠标旋转它。
如果使用wx
后端,您可以定期调用wx.Yield()
如果你想要一些长期过程与数据进行交互运行功能。在下面的例子中,wx.Yield()
被称为每个“long running”函数的迭代,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)
I瘦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)
谢谢,这与我想要的非常接近。我发现虽然在睡眠阶段,我无法操纵这个数字。你也有这个问题吗?和任何解决方案? –
你真的不需要睡觉,因为延迟是在我想的装饰器中给出的。你究竟在哪里试图操纵这个数字? –
'操纵'我的意思是用鼠标旋转图像。睡眠步骤旨在模拟我的程序对数据进行一些处理。我的想法是,我希望可视化工具在执行慢程序期间显示数据,这可能只会每隔10秒左右产生一个新结果。 –
程序在我的最新评论,你可以简化代码和操作更新期间的数字是不带'time.sleep()'。这对你有用吗?由于Mayavi被移植到'qt',所以解决方案应该比使用'wx'更好:0 –