Python Jupyter笔记本中的交互式绘图

Python Jupyter笔记本中的交互式绘图,python,matplotlib,real-time,interactive,jupyter,Python,Matplotlib,Real Time,Interactive,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.z

我正试图在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)
我的目的是想看看情节是如何随着时间的推移而变化的。 我还尝试通过pl.ion()打开交互模式,将backent更改为inline,调用pl.draw(),但没有一个成功。顺便说一句,progressbar工作得很好


感谢Radek

下面的代码应该可以做到这一点:

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)

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

看看
%matplotlib notebook
,它为您提供了一个完整的交互式后端。您需要将图形放在不同于循环的单元格中,如果你看一下我发布的链接,你会发现它们在不同的cel中。但是这确实有效:1)你必须将matplotlib magic更改为inline,2)它创建第二个plot(因此可以省略第一个plot),但主要是,3)速度非常慢(我想是因为你正在重新绘制所有内容)。因此,尽管它可以工作,但感觉不是最佳方式……1)是的:-(,2)我修改了代码以改进这一点,3)我修改了循环以提高大约30/40%的性能,但速度很慢。很抱歉,我不知道在笔记本上还有什么更好的方法。最后,你必须
显示
图像,你要显示1000个图像,前后端通信1000次。
显示
步骤大约需要130ms,循环中的其余代码大约需要10ms,因此循环中的每个步骤大约需要140ms。如果你找到更好的方法,就把它贴在这里;-)