我和matplotlib一起使用了很多i
Python笔记本,虽然很多情况下我很高兴它会在我调用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,y_max)) ax.imshow(im2,aspect=1.5) raster = ax.imshow(points,origin='lower') fig.colorbar(raster) ax.set_title('coordinates plot') fig.savefig("fancy-annotated-map.png",bBox_inches=0) pylab.ion()
>这假设您仅在IPython中使用该函数,否则始终导入pylab.更好地包装尝试…除了它周围所以该功能可以在别处使用.
>看看the template for making your own IPython Magic functions(%或%%函数调用,如%cpaste).一个很好的方法是创建你自己的魔法,比如%imnoshow或其他东西,它只包含调用imshow的部分,这样你就可以在不显示输出的情况下对imshow输出进行内联处理.既然你的问题没有处理一般的情节界面,而是这个特定的界面,我不会尝试在这里实现它,但希望上面的链接应该足以让你可以实现一些东西.
>另一种方法是按照设置自己的IPython configuration environment的说明,包括一些特殊的.py文件,你自己的导入和辅助类定义等.然后在那里放置你自己的特殊绘图功能,以便在启动时加载它们并且可以在IPython的全球范围内使用.我强烈推荐这个原因有以下几个原因:(a)你实际上可以为自己的帮助函数编写单元测试,如果你愿意,甚至可以在每次启动IPython时轻松测试! (b)这使您可以更轻松地进行版本控制,并封装您经常需要的辅助函数的逻辑. (c)您可以获得“只是在那里”功能的好处,而无需使其成为魔术功能或稍后导入.