Mayavi плохо играет с ipywidgets в блокноте Jupyter
Есть ли какая-то причина, по которой Mayavi не будет работать вместе с ipywidgets внутри ноутбука Jupyter? Я могу вывести на экран x3d изображение Mayavi внутри ноутбука, используя mlab.init_notebook(), например:
from mayavi import mlab
import numpy as np
mlab.init_notebook()
mlab.clf()
phi, theta = np.mgrid[0:np.pi:11j, 0:2*np.pi:11j]
x = np.sin(phi) * np.cos(theta)
y = np.sin(phi) * np.sin(theta)
z = np.cos(phi)
mlab.mesh(x, y, z)
mlab.mesh(x, y, z, representation='wireframe', color=(0, 0, 0))
Однако, если я добавлю кнопку (ipywidget), чтобы вызвать функцию для построения той же фигуры Mayavi, график нигде не отобразится.
from ipywidgets import widgets
from IPython.display import display
from mayavi import mlab
import numpy as np
mlab.init_notebook()
def click(a):
mlab.clf()
phi, theta = np.mgrid[0:np.pi:11j, 0:2*np.pi:11j]
x = np.sin(phi) * np.cos(theta)
y = np.sin(phi) * np.sin(theta)
z = np.cos(phi)
mlab.mesh(x, y, z)
mlab.mesh(x, y, z, representation='wireframe', color=(0, 0, 0))
button=widgets.Button(description='Click Me')
button.on_click(click)
display(button)
1 ответ
Вы должны использовать IPython.display.display
сделать так, чтобы он отображался в записной книжке (неявно, когда объект Mayavi является возвращаемым значением последнего mesh()
вызов):
from IPython.display import display
obj = mlab.mesh(x, y, z)
display(obj)
Поскольку Mayavi не обновляет в интерактивном режиме графики для записных книжек, вам нужно будет снова вызвать дисплей в режиме обратного вызова кнопки. В случае, если кнопка нажата несколько раз, вы также должны очистить предыдущий график с IPython.display.clear_output
:
from IPython import display, clear_output
def click(a):
mlab.clf()
...
f = mlab.figure()
mlab.mesh(x, y, z)
mlab.mesh(x, y, z, representation='wireframe', color=(0, 0, 0))
clear_output(wait=True)
# Since we clear outputs, we also need to redisplay button
display(button, f)