当前位置:  开发笔记 > 编程语言 > 正文

在Jupyter/iPython中动态更新绘图的当前正确方法是什么?

如何解决《在Jupyter/iPython中动态更新绘图的当前正确方法是什么?》经验,为你挑选了2个好方法。

在如何动态更新ipython笔记本(在一个单元格内)循环中的绘图的答案中,给出了如何在Python循环内动态更新Jupyter笔记本内部的绘图的示例.然而,这可以通过在每次迭代中销毁和重新创建绘图来实现,并且其中一个线程中的注释指出可以通过使用new-ish %matplotlib nbaggmagic 来改善这种情况,这提供了嵌入在笔记本中的交互式图形,而不是而不是静态图像.

然而,nbagg就我所知,这个奇妙的新功能似乎完全没有记录,我无法找到如何使用它来动态更新绘图的示例.因此,我的问题是,如何使用nbagg后端有效地更新Jupyter/Python笔记本中的现有绘图?由于在matplotlib中动态更新绘图通常是一个棘手的问题,一个简单的工作示例将是一个巨大的帮助.指向该主题的任何文档的指针也非常有用.

要清楚我要求的是:我想要做的是运行一些模拟代码进行几次迭代,然后绘制其当前状态的图,然后再运行几次迭代,然后更新图表以反映当前状态,等等.因此,我们的想法是绘制一个绘图,然后在没有任何用户交互的情况下更新绘图中的数据,而不会破坏和重新创建整个事物.

以下是对上述链接问题的答案的一些略微修改的代码,通过每次重新绘制整个数字来实现这一点.我希望获得相同的结果,但更有效地使用nbagg.

%matplotlib inline
import time
import pylab as pl
from IPython import display
for i in range(10):
    pl.clf()
    pl.plot(pl.randn(100))
    display.display(pl.gcf())
    display.clear_output(wait=True)
    time.sleep(1.0)

pneumatics.. 56

这是一个更新循环中的绘图的示例.它会更新图中的数据,并且不会每次都重绘整个数字.它会阻止执行,但如果您对运行一组有限的模拟并将结果保存在某个地方感兴趣,那么对您来说可能不是问题.

%matplotlib notebook

import numpy as np
import matplotlib.pyplot as plt
import time

def pltsin(ax, colors=['b']):
    x = np.linspace(0,1,100)
    if ax.lines:
        for line in ax.lines:
            line.set_xdata(x)
            y = np.random.random(size=(100,1))
            line.set_ydata(y)
    else:
        for color in colors:
            y = np.random.random(size=(100,1))
            ax.plot(x, y, color)
    fig.canvas.draw()

fig,ax = plt.subplots(1,1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(0,1)
ax.set_ylim(0,1)
for f in range(5):
    pltsin(ax, ['b', 'r'])
    time.sleep(1)

我在这里把它放在nbviewer上.

有一个IPython Widget版本nbagg,目前正在Matplotlib存储库中进行中.当它可用时,这可能是最好的使用方式nbagg.

编辑:更新以显示多个图



1> pneumatics..:

这是一个更新循环中的绘图的示例.它会更新图中的数据,并且不会每次都重绘整个数字.它会阻止执行,但如果您对运行一组有限的模拟并将结果保存在某个地方感兴趣,那么对您来说可能不是问题.

%matplotlib notebook

import numpy as np
import matplotlib.pyplot as plt
import time

def pltsin(ax, colors=['b']):
    x = np.linspace(0,1,100)
    if ax.lines:
        for line in ax.lines:
            line.set_xdata(x)
            y = np.random.random(size=(100,1))
            line.set_ydata(y)
    else:
        for color in colors:
            y = np.random.random(size=(100,1))
            ax.plot(x, y, color)
    fig.canvas.draw()

fig,ax = plt.subplots(1,1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xlim(0,1)
ax.set_ylim(0,1)
for f in range(5):
    pltsin(ax, ['b', 'r'])
    time.sleep(1)

我在这里把它放在nbviewer上.

有一个IPython Widget版本nbagg,目前正在Matplotlib存储库中进行中.当它可用时,这可能是最好的使用方式nbagg.

编辑:更新以显示多个图


@pneumatics不幸的是,在Retina显示屏上Matplotlib 2.0存在一些问题:在循环图中通常比两倍小.

2> Ziofil..:

我正在使用jupyter-lab,这对我有用(适合您的情况):

from IPython.display import clear_output
from matplotlib import pyplot as plt
import collections
%matplotlib inline

def live_plot(data_dict, figsize=(7,5), title=''):
    clear_output(wait=True)
    plt.figure(figsize=figsize)
    for label,data in data_dict.items():
        plt.plot(data, label=label)
    plt.title(title)
    plt.grid(True)
    plt.xlabel('epoch')
    plt.legend(loc='center left') # the plot evolves to the right
    plt.show();

然后在循环中填充字典,然后将其传递给live_plot()

data = collections.defaultdict(list)
for i in range(100):
    data['foo'].append(np.random.random())
    data['bar'].append(np.random.random())
    data['baz'].append(np.random.random())
    live_plot(data)

确保在图下方有一些单元格,否则每次重绘图时视图都会锁定到位。

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有