你如何更新 Ipython 中的内联图像?
Posted
技术标签:
【中文标题】你如何更新 Ipython 中的内联图像?【英文标题】:How do you update inline images in Ipython? 【发布时间】:2018-04-17 21:24:51 【问题描述】:编辑:我的问题不是关于“动画”本身。我的问题只是关于如何在 for 循环中连续 show,new 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 中显示文件中的图像?
如何通过 python 脚本而不是 ipython 使用 SPy 显示高光谱图像?
python IPython Notebook,改变内联图形大小