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

时间:2013-11-14 16:20:09

标签: matplotlib jupyter-notebook ipython

我和matplotlib一起使用了很多iPython笔记本,虽然很多情况下我很高兴它会在我调用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)

1 个答案:

答案 0 :(得分:3)

尝试将其移动到一个函数中,并在函数的开头执行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. 查看the template for making your own IPython Magic functions%%%函数调用,例如%cpaste)。一个很好的方法是创建自己的魔法,比如%imnoshow或其他东西,它只包含调用imshow的部分,这样你就可以对imshow输出进行内联处理无需看到输出。既然你的问题没有处理一般的情节界面,而是这个特定的界面,我不会尝试在这里实现这个,但希望上面的链接应该足够你可以实现一些东西,如果你需要

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