你如何更新 Ipython 中的内联图像?

Posted

技术标签:

【中文标题】你如何更新 Ipython 中的内联图像?【英文标题】:How do you update inline images in Ipython? 【发布时间】:2018-04-17 21:24:51 【问题描述】:

编辑:我的问题不是关于“动画”本身。我的问题只是关于如何在 for 循环中连续 shownew inline image,在 Ipython 笔记本中。

本质上,我想在同一位置显示更新的图像,内联,并让它在循环内更新以显示。所以我的代码目前看起来像这样:

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from IPython import display
%matplotlib inline  

fig, ax = plt.subplots(nrows = 1, ncols = 1, figsize=(10, 10))
for ii in xrange(10):
    im = np.random.randn(100,100)
    ax.cla()
    ax.imshow(im, interpolation='None')
    ax.set_title(ii)
    plt.show()

问题在于,这目前只是...,嗯,显示第一张图片,然后它永远不会改变。

相反,我希望它在每次迭代时简单地显示更新的图像,内联,在同一个地方。我怎么做?谢谢。

【问题讨论】:

执行这个,我得到:ax[0].cla(): TypeError: 'AxesSubplot' object does not support indexing @bastelflp 抱歉,现在试试。 我不相信这是重复的,因为这与循环显示的 numpy 数组有关。它与“动画”本身无关。 matplotlib.use('TkAgg')%matplotlib inline 行冲突,因为它们引用了不同的后端。您想要内嵌图像还是单独的窗口? @PierredeBuyl 好点。我想更新内嵌图片。 【参考方案1】:

您可以在每次向图中添加新内容时调用figure.canvas.draw()。这将刷新绘图(来自here)。试试:

import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from IPython import display
from time import sleep

fig = plt.figure()
ax = fig.gca()
fig.show()

for ii in range(10):
    im = np.random.randn(100, 100)
    plt.imshow(im, interpolation='None')
    ax.set_title(ii)
    fig.canvas.draw()
    sleep(0.1)

但是,我无法在 IPython Notebook 中对此进行测试。

【讨论】:

谢谢,但这不适用于 Ipython。在这里,它只是处理并显示最后一张图像。【参考方案2】:

我不确定你是否可以在没有动画的情况下做到这一点。绘图结束后,笔记本会捕获 matplotlib 的输出以包含在单元格中。动画框架相当通用,涵盖了非静态图像的任何内容。 matplotlib.animation.FuncAnimation 可能会做你想做的事。

我将您的代码修改如下:

%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation

f = plt.figure()
ax = f.gca()

im = np.random.randn(100,100)
image = plt.imshow(im, interpolation='None', animated=True)

def function_for_animation(frame_index):
    im = np.random.randn(100,100)
    image.set_data(im)
    ax.set_title(str(frame_index))
    return image,

ani = matplotlib.animation.FuncAnimation(f, function_for_animation, interval=200, frames=10, blit=True)

注意:%matplotlib notebook必须重启笔记本才能生效,并使用支持动画的后端。

编辑:通常有一种方法更接近您的原始问题,但它在我的计算机上出错。在示例 animation_demo 中,有一个简单的“for 循环”,其中带有一个 plt.pause(0.5) 语句也应该可以工作。

【讨论】:

以上是关于你如何更新 Ipython 中的内联图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jupyter Notebook 中显示文件中的图像?

CentOS 6.5升级Python和安装IPython

如何通过 python 脚本而不是 ipython 使用 SPy 显示高光谱图像?

python IPython Notebook,改变内联图形大小

可以在不使用内联绘图的情况下远程访问 IPython Notebook 吗?

熊猫图在 ipython 笔记本中未显示为内联