【问题标题】:Interactive plot in Jupyter notebookJupyter 笔记本中的交互式绘图
【发布时间】:2016-07-04 05:46:12
【问题描述】:

我正在尝试在 Jupyter 笔记本中进行“实时”绘图。 该示例可以在here 找到。代码如下:

%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() 设置交互式模块,将后端更改为内联,调用 pl.draw(),但没有一个工作。顺便说一句,进度条工作得很好......

感谢拉德克

【问题讨论】:

  • 看看%matplotlib notebook,它为您提供了一个完整的交互式后端。
  • 您需要将您的图形放在与循环不同的单元格中,否则它应该可以工作。
  • 如果您查看我发布的链接,您会发现它们位于不同的 cels 中。

标签: python matplotlib real-time interactive jupyter


【解决方案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)

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

【讨论】:

  • 这确实有效,但是:1)您必须将 matplotlib 魔术更改为内联,2)它会创建第二个图(因此可以省略第一个图),但主要是,3)它非常慢(我猜是因为您正在重绘所有内容)。因此,即使它有效,但感觉并不是最佳方式......
  • 1) 是的 :-(, 2) 我修改了代码以改进这一点,3) 我修改了循环以提高大约 30/40% 的性能,但速度很慢。对不起,但我不知道在笔记本上做这件事的更好方法。最后,您必须display 图像,并且您正在显示 1000 张图像并与前端和后端通信 1000 次。 display 步骤大约需要 130 毫秒,循环中的其余代码需要大约 10 毫秒,因此循环中的每个步骤大约需要 140 毫秒。如果您找到更好的方法,请在此处发布;-)
猜你喜欢
  • 2021-01-27
  • 2019-11-13
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2020-07-19
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多