Mayavi 在 Jupyter notebook 中使用 ipywidgets 并不友好



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)   

相关内容

  • 没有找到相关文章

最新更新