如何在 python 循环中更新 matpplotlib 库图,该图位于 Jupyter 笔记本中的同一位置?

Posted

技术标签:

【中文标题】如何在 python 循环中更新 matpplotlib 库图,该图位于 Jupyter 笔记本中的同一位置?【英文标题】:How to update matpplotlib lib plots in a python loop with the plot sitting in the same place in a Jupyter notebook? 【发布时间】:2019-05-23 00:35:27 【问题描述】:

我正在使用 python 3.6.7、matplotlib 2.2.2、ipython 7.0.1、笔记本 5.6.0 和 jupyter 1.0.0。

我想创建 10 个显示在 2 行上的图,这些图在循环期间将保持在 jupyter notebook 上的同一位置,并且每 10 次迭代都会在相同的 10 个图中显示新结果。这里有一些虚拟代码仅供参考。

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 5, sharex='col', sharey='row', figsize=(40,15))
ax = ax.flatten()
for i in range(TRAIN_STEPS):
    if i%10 == 0:
        for j in range(10):
            ax[j].set_title(j+i,fontsize=40)
            ax[j].axes.get_xaxis().set_visible(False)
            ax[j].axes.get_yaxis().set_visible(False)
            ax[j].imshow(weight[i]), cmap=plt.get_cmap('seismic'))
    if i%100 == 0:
         print('Step:' + str(i)) 

我使用 i+j 创建了标题,以便更好地查看更新内容。在此示例中,图集仅在结束时显示(而不是在循环期间)。

如果我使用plt.show(),那么我只看到第一组图

我不想保存每组的情节并稍后制作动画。知道我们是否可以做到这一点以及如何做到这一点? (我看了很多东西,但我错过了一些东西plt.ion()plt.show(block=False)plt.pause(1)time.sleep(0.1)f = plt.figure()f.canvas.update()f.canvas.flush_events()f.canvas.draw_idle()

【问题讨论】:

how to dynamically update a plot in a loop in ipython notebook (within one cell)的可能重复 【参考方案1】:

似乎我找到了一种通过添加来做我想做的事情的方法:

display.clear_output(wait=True)
display.display(plt.gcf())
time.sleep(1.0) 

还有 2 个小问题:

每一步的信息在每次迭代时都会被删除,并且只打印最后一个条目。

这组 10 个图在最后一次迭代后显示两次。使用在另一个线程中找到的以下代码可以轻松重现它

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

【讨论】:

【参考方案2】:

我正在做类似的事情...检查数据,在循环中创建一个图,并一次将它们可视化。你的代码帮助我做对了!

在我的情况下,我每次都制作一个新图,为了避免循环结束时出现第二个数字,我使用了plt.close()。但是在您的示例中,这将不允许保留以前的图。解决方法是创建数字并将它们保存在一个列表中,以便在第二个循环中绘制。

%matplotlib inline
import time
import pylab as pl
from IPython import display

numbers = []
for i in range(3):
    
    numbers.append(pl.randn(10))
    for j in range(i+1):
        pl.plot(numbers[j]) 
        
    display.clear_output(wait=True) 
    display.display(pl.gcf())
    time.sleep(1.0)
    plt.close()

【讨论】:

以上是关于如何在 python 循环中更新 matpplotlib 库图,该图位于 Jupyter 笔记本中的同一位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 循环中更新 matpplotlib 库图,该图位于 Jupyter 笔记本中的同一位置?

python 如何在多层循环中使用break/continue

在Python类中使用for循环更新列表

如何在Python中更新GUI窗口?

如何使用 configparser 更新值 python .ini 文件

在更新字典时加速嵌套的 Python 循环