2016-10-03 4 views
2

Что я хочу сделать, это обновить график майяви в цикле. Я хочу, чтобы обновление графика выполнялось в указанное мной время (в отличие, например, от декоратора анимации).Обновление майяри в петле

Так пример кусок кода, который я хотел бы получить это работает:

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().

Будут оценены любые указатели или ссылки на соответствующую документацию.


EDIT

ответ Дэвида Винчестера становится на шаг ближе к решению.

Однако, как я отмечаю в комментариях, я не могу манипулировать фигурой мышью во время шага time.sleep(). Именно на этом этапе в полной программе компьютер будет занят вычислением нового значения V. За это время я хотел бы иметь возможность манипулировать фигурой, вращать ее с помощью мыши и т. Д.

+0

В моем последнем комментарии вы можете упростить код и манипулировать фигуру во время обновления без 'time.sleep()'. Это сработало для вас? Решение должно быть лучше, чем использование 'wx', поскольку Mayavi портируется на' qt': o –

ответ

1

Если вы используете 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) 
1

I тонкий майяви использует 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)

+0

Спасибо, это очень близко к тому, что я хочу. Я нахожу, что во время «сна» я не могу манипулировать фигурой. У вас также есть эта проблема? И любые решения? –

+0

На самом деле вам не нужен сон, так как задержка дается в декораторе, я думаю. Где именно вы пытаетесь манипулировать фигурой? –

+0

Под «манипулировать» я имею в виду поворот изображения с помощью мыши. Этап сна предназначен для моделирования моей программы, выполняющей некоторую обработку данных. Идея состоит в том, что я хочу, чтобы визуализатор отображал данные во время выполнения медленной программы, которая может генерировать только новые результаты каждые 10 секунд или около того. –

 Смежные вопросы

  • Нет связанных вопросов^_^