【问题标题】:Mayavi not playing nice with ipywidgets in Jupyter notebookMayavi 在 Jupyter Notebook 中与 ipywidgets 玩得不好
【发布时间】:2017-10-26 02:36:03
【问题描述】:

为什么 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)

【问题讨论】:

    标签: python-2.7 button mayavi ipywidgets


    【解决方案1】:

    您必须使用 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)   
    

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 2018-05-29
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多