iPython notebook:如何防止在 imshow() 上输出图像



我经常将iPython笔记本与matplotlib一起使用,虽然在很多情况下我很高兴,当我调用imshow()时它会自动显示图像,但有时我想防止这种行为。

具体来说,我正在循环一个非常大的数组,并在 matplotlib 中为每个应该保存到磁盘的元素生成一个图形。作为图形创建的一部分,我必须调用imshow()将现有图像(在我的例子中是地图的屏幕截图)绘制到轴上,以便稍后在其上绘制其他材料。每当我调用imshow作为过程的一部分时,最终图形都会内联显示在iPython笔记本中,我该如何防止这种情况?

我的代码看起来像这样:

import matplotlib as plt
fig = plt.pyplot.figure(figsize=(20,20))
im2 = plt.pyplot.imread('/some/dir/fancy-map.png')
# Magic to calculate points, x_min etc.
fig.clf()
ax = fig.gca(xlim=(x_min, x_max), ylim=(y_min, y_max))
ax.imshow(im2, extent=(4, 4.5746, 42.5448, 43.3791), aspect=1.5)
raster = ax.imshow(points, vmin = 0, vmax=maxval, extent=(x_min, x_max, y_min, y_max), aspect=1.5, origin='lower')
fig.colorbar(raster)
ax.set_title('coordinates plot')
fig.savefig("fancy-annotated-map.png", bbox_inches=0)

尝试将其移动到函数中,并在函数开始时执行pylab.ioff(),最后返回到pylab.ion()

# Obvs add arguments so you can pass in your data and plot choices.
def make_img():
    pylab.ioff()
    import matplotlib as plt
    fig = plt.pyplot.figure(figsize=(20,20))
    im2 = plt.pyplot.imread('/some/dir/fancy-map.png')
    # Magic to calculate points, x_min etc.
    fig.clf()
    ax = fig.gca(xlim=(x_min, x_max), ylim=(y_min, y_max))
    ax.imshow(im2, extent=(4, 4.5746, 42.5448, 43.3791), aspect=1.5)
    raster = ax.imshow(points, 
                       vmin = 0, 
                       vmax=maxval, 
                       extent=(x_min, x_max, y_min, y_max), 
                       aspect=1.5, 
                       origin='lower')
    fig.colorbar(raster)
    ax.set_title('coordinates plot')
    fig.savefig("fancy-annotated-map.png", bbox_inches=0)
    pylab.ion()
  1. 这假设您仅在 IPython 中使用该功能,否则始终导入pylab。最好包装一个try...except围绕它,以便可以在其他地方使用该功能。

  2. 看看制作自己的IPython Magic函数的模板(%%%函数调用,如%cpaste)。一个不错的方法是创建自己的魔法,例如%imnoshow或其他东西,仅包装调用imshow的部分,以便您无需查看输出即可对imshow输出进行内联处理。由于您的问题不涉及一般的情节界面,而是涉及这个特定的界面,因此我不会尝试在这里实现这一点,但希望上面的链接应该足以让您在需要时实现一些东西。

  3. 另一种方法是按照说明设置您自己的 IPython 配置环境,包括让一些特定的.py文件充满您自己的导入和帮助程序类定义等。然后在那里放置您自己的特殊绘图函数,以便在启动时加载它们并在 IPython 中全局范围内可用。我强烈推荐这个有几个原因:(a)你实际上可以为自己的帮助程序函数编写单元测试,如果你愿意,甚至可以在每次启动IPython时轻松进行测试!(b) 这使您可以更轻松地进行版本控制,并封装您经常需要的帮助程序函数的逻辑。(c) 您可以获得"只是在那里"功能的好处,而无需将其设置为魔术函数或稍后导入它。

最新更新