我和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)
答案 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()
这假设您仅在IPython中使用该功能,或者始终导入pylab
。更好地将try
... except
包裹起来,以便可以在其他地方使用该功能。
查看the template for making your own IPython Magic functions(%
或%%
函数调用,例如%cpaste
)。一个很好的方法是创建自己的魔法,比如%imnoshow
或其他东西,它只包含调用imshow
的部分,这样你就可以对imshow
输出进行内联处理无需看到输出。既然你的问题没有处理一般的情节界面,而是这个特定的界面,我不会尝试在这里实现这个,但希望上面的链接应该足够你可以实现一些东西,如果你需要
另一种方法是按照设置自己的IPython configuration environment的说明进行操作,包括让一些特定的.py
文件充满您自己的导入和辅助类定义等。然后放置您自己的特殊的绘图功能,以便在启动时加载它们并在IPython的全局范围内可用。我强烈推荐这个原因有以下几个原因:(a)你实际上可以为自己的帮助函数编写单元测试,如果你愿意,甚至可以在每次启动IPython时轻松测试! (b)这使您可以更轻松地进行版本控制,并封装您经常需要的辅助函数的逻辑。 (c)你得到了这个功能的好处"只是在那里"无需使其成为神奇的功能或稍后导入。