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

Rob*_*bin 5 matplotlib ipython jupyter-notebook

我和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)
Run Code Online (Sandbox Code Playgroud)

ely*_*ely 4

尝试将其移动到一个函数中,并在函数开始时执行 dopylab.ioff()并在结束时返回 to 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()
Run Code Online (Sandbox Code Playgroud)
  1. 这假设您仅在 IPython 中使用该函数,否则pylab始终导入该函数。最好在它周围加上try... except,以便该函数可以在其他地方使用。

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

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