Jupyter笔记本中的交互式情节

rad*_*rad 6 python interactive real-time matplotlib jupyter

我试图在Jupyter笔记本中进行"实时"绘图.这个例子可以在这里找到.这是代码:

%matplotlib notebook

import numpy as np
import matplotlib.pyplot as pl

from random import randint
from time import sleep

from ipywidgets import FloatProgress
from IPython import display

siz = 10
dat = np.zeros((siz, siz))

fig = pl.figure()
axe = fig.add_subplot(111)
img = axe.imshow(dat)

num = 1000

prgBar = FloatProgress(min=0, max=num-1)
display.display(prgBar)

for i in range(num):
    prgBar.value = i
    pos = (randint(0, siz-1), randint(0, siz-1))
    dat[pos] += 1
    img.set_data(dat)
    img.autoscale()
    #sleep(0.01)
Run Code Online (Sandbox Code Playgroud)

我的目标是看每个迭代后情节如何变化.我也尝试通过pl.ion()设置交互式mod,更改后退到内联,调用pl.draw(),但是没有它正在工作.顺便说一句,进度条工作得很好......

谢谢拉德克

kik*_*oso 1

下面的代码应该可以解决这个问题:

import numpy as np
import matplotlib.pyplot as plt

from random import randint
from time import sleep

from ipywidgets import FloatProgress
from IPython.display import display, clear_output

siz = 10
dat = np.zeros((siz, siz))

fig = plt.figure()
axe = fig.add_subplot(111)
img = axe.imshow(dat)

num = 1000

prgBar = FloatProgress(min=0, max=num-1)
display(prgBar)

for i in range(num):
    clear_output(wait = True)
    prgBar.value = i
    pos = (randint(0, siz-1), randint(0, siz-1))
    dat[pos] += 1
    img.set_data(dat)
    img.autoscale()
    display(fig)
Run Code Online (Sandbox Code Playgroud)

我更改了 for 循环,在每个步骤上创建图像,并导入clear_output以清理每个步骤的单元格输出。

  • 1) 是的:-(, 2) 我修改了代码来改进这一点,3) 我修改了循环以提高性能约 30/40%,但速度很慢。很抱歉,但我不知道在笔记本中执行此操作的更好方法。最后你必须“显示”图像,并且你要显示 1000 张图像并与前端和后端通信 1000 次。“显示”步骤大约需要 130 毫秒,循环中的其余代码大约需要 10 毫秒,因此循环中的每个步骤大约需要 140 毫秒。如果您找到更好的方法,请将其发布在这里;-) (2认同)