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

6
我经常使用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)
1个回答

4
尝试将此内容移入函数中,在函数开始处执行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魔术函数的模板%%%函数调用,例如%cpaste)。一个好的方法是创建自己的魔术,例如%imnoshow或类似的东西,仅包装调用imshow的部分,这样您就可以进行imshow输出的内联处理,而不必看到输出。由于您的问题与一般的绘图界面无关,而是与特定的绘图界面有关,因此我不会在此处尝试实现这一点,但希望上面的链接足以让您在需要时实现某些内容。

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


太好了,谢谢!目前我直接使用 pylab.ioff(),但肯定会考虑将其制作成 iPython 魔术函数。 - Robin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接