你如何在Ipython中更新内嵌图像?

时间:2017-11-05 17:49:51

标签: python matplotlib ipython jupyter-notebook imshow

编辑:我的问题不在于"动画"本身。我的问题是,如何在for循环中连续显示 内嵌 图像,在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()

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

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

2 个答案:

答案 0 :(得分:2)

每次向图中添加新内容时,都可以调用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笔记本中测试它。

答案 1 :(得分: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)语句也应该有效。