如何使用 JupyterLab 循环更新交互式图形

kgo*_*ick 3 python matplotlib jupyter jupyter-lab

我正在尝试使用 JupyterLab 在循环中更新交互式 matplotlib 图形。如果我在与循环不同的单元格中创建图形,我就可以执行此操作,但我更愿意创建图形并在同一单元格中运行循环。

简单代码示例:

import matplotlib.pyplot as plt
import time

%matplotlib widget

fig = plt.figure()

for i in range(5):
    x = list(range(i+2))
    xx = [x**2 for x in x]
    plt.clf()
    plt.plot(x, xx)
    fig.canvas.draw()
    
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

如果fig = plt.figure()与循环位于同一单元格中,则在循环完成之前不会更新图形:

不动态更新

如果我在不同的单元格中创建图形,我会得到动态更新,但如果可能的话,我希望能够在同一单元格中创建图形,以便输出位于循环下方:

需要额外的细胞

我在其他问题中尝试了几个答案(此处此处此处),但是它们似乎不适用于 JupyterLab 中的交互式图形。我使用jupyter/scipy-notebook docker 镜像作为我的环境,所以我相信一切都设置正确。

有什么方法可以在创建图形的同一单元格中获得动态更新吗?

Bla*_*kHC 5

如果您不想使用asyncio,您可以使用display(..., display_id=True)来获取句柄并使用.update()它:

import matplotlib.pyplot as plt
import time
%matplotlib widget
fig = plt.figure()

hfig = display(fig, display_id=True)


def update():
    for i in range(5):
        print(i)
        x = list(range(i + 2))
        xx = [x**2 for x in x]
        plt.clf()
        plt.plot(x, xx)
        fig.canvas.draw()
        hfig.update(fig)
        time.sleep(1)

update()

plt.close(fig)
Run Code Online (Sandbox Code Playgroud)

PS:一定要关闭你的身材!


归档时间:

查看次数:

3294 次

最近记录:

3 年,1 月 前