Mayavi有什么理由不能与Jupyter笔记本中的ipywidgets一起使用吗?我可以使用"mlab.init_notebook()"在笔记本内联显示 x3d Mayavi 图像,如下所示:
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)
使用 IPython.display.display
将其呈现到笔记本(当 mayavi 对象是最后一次mesh()
调用的返回值时隐式完成):
from IPython.display import display
obj = mlab.mesh(x, y, z)
display(obj)
由于 mayavi 不会以交互方式更新笔记本的绘图,因此您需要在按钮回调中再次调用 display。如果按钮被点击了几次,你还应该用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)