缓慢的matplotlib和ipywidgets图像刷新

2024-09-28 22:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用plt.show()和ipywidgetsinteract()函数滚动一些磁共振切片。通过缓慢移动滑块,我没有发现任何问题,但是当滑动速度加快一点时,会发现一个重要的延迟

下面是我正在使用的代码

def dicom_animation(x, volume):
    fig = plt.figure(figsize=(8,8))
    plt.imshow(volume['slices'][x]['pixel_array'], cmap=plt.cm.gray)


interact(dicom_animation, volume = fixed(a), x=IntSlider(round(len(a['slices'])/2,0), 0, (len(a['slices'])-1), layout=Layout(width='500px')))

this是结果

我能做些什么来让滑得更快一点而不耽搁这么重要的时间吗


Tags: 函数代码lendefshow切片plt速度
1条回答
网友
1楼 · 发布于 2024-09-28 22:22:29

重新绘制图形和调用plt.imshow都是非常昂贵的操作,这正是减慢速度的原因。相反,您需要使用交互式matplotlib后端,然后使用类似set_data的方法

安装ipympl

ipympl是matplotlbi的一个交互式后端,可在jupyter nobteook和jupyterlab中使用。它有一个很好的示例笔记本,在这里解释了如何与其他小部件交互:https://github.com/matplotlib/ipympl/blob/0.6.1/examples/ipympl.ipynb

对于JupyterLab 3+来说,安装此软件非常容易,因此:

pip install  upgrade jupyterlab ipympl

手动创建滑块

虽然interact很方便,但它并不适合ipympl,因为它希望在每次滑块更改时完全重新生成输出

%matplotlib ipympl

# the rest of your setup code

fig, ax = plt.figure()
img = ax.imshow(volume['slices'][x]['pixel_array'], cmap=plt.cm.gray)

def update_plot(change):
    img.set_data(volume['slices'][change['new']['pixel_array']
    fig.canvas.draw_idle()

x_slider = IntSlider(round(len(a['slices'])/2,0), 0, (len(a['slices'])-1)
x_slider.observe(update_plot, names='value')

使用mpl交互

手动设置滑块可能会非常麻烦。因此,我编写了一个库,使使用小部件轻松控制交互式绘图。它负责创建滑块,并为您执行所有正确的操作,例如使用set_data。如果您不在jupyter笔记本电脑中,它还将使用matplotlib滑块,因此更便于携带

就你而言,你会对imshow example感兴趣 或者,根据数据的结构,您也可以使用hyperslicer

你的例子是:

%matplotlib ipympl

import mpl_interactions.ipyplot as iplt
# other setup stuff
volume = a

def f(x):
    return volume['slices'][x]['pixel_array']

fig, ax = plt.subplots()
controls = iplt.imshow(f, cmap=plt.cm.gray, x = np.arange(0, len(a)-1))

相关问题 更多 >