起因是在今年打数模国赛时,注意到队友用matplotlib生成的图像是在可交互窗口打开的,而在我自己的设备上运行,却变成了静态图片,无法调整大小、(三维)方向、坐标轴比例。
原来,Python可视化库matplotlib的显示模式默认为阻塞(block)模式,即:plt.show()之后,程序会触发system("pause")暂停,并不会继续执行下去,如果需要继续执行程序,就要关闭图片。
以此为起点,发现我在Matplotlib库的图像交互模式方面存在很多的知识缺口。因此,本篇是以Pycharm IDE为实践环境,对Matplotlib库图像交互模式的理解
前置知识:Matplotlib库的图表布局函数
通过plt.figure()等方法生成plt对象后,首先可以通过基础的函数进行布局调整。
1.tight_layout方法:自动调整
plt.tight_layout()
这个函数用于自动调整子图参数,以给子图之间留出足够的空间。能够起到以下作用:
- 防止子图之间的重叠
- 确保标题、标签等不会超出图形边界
- 优化图形的整体布局
一般来说,多个图生成的语境中,都要最先(在生成plt对象之后)加上它来调整布局。
2. show方法:在非交互式环境中展示
plt.show():
在非交互式环境中(如.py脚本文件中),直接打开一个包含该图形的新窗口。指定参数block=False,可以防止其阻碍程序继续执行。
3. savefig方法:图片保存到本地
plt.savefig('图片名.后缀')
4. ion/ioff方法:切换图像显示模式
plt.ion()
plt.ioff()
控制交互模式的开关。具体见下文说明:
Matplotlib图像显示:阻塞(block)与交互(interactive)模式
Python可视化库matplotlib的显示模式默认为阻塞(block)模式,即:plt.show()之后,程序会触发system("pause")暂停,并不会继续执行下去,如果需要继续执行程序,就要关闭图片。
如果需要展示动态图或多个窗口,就要使用plt.ion()这个函数,使matplotlib的显示模式转换为交互(interactive)模式。即使在脚本中遇到plt.show(),代码还是会继续执行。下面这段代码是展示两个不同的窗口:
import matplotlib.pyplot as plt
plt.ion() # 打开交互模式
# 同时打开两个窗口显示图片
plt.figure() #图片一
plt.imshow(i1)
plt.figure() #图片二
plt.imshow(i2)
在plt.show()之前一定不要忘了加plt.ioff(),如果不加,界面会一闪而过,并不会停留。需要在plt.show()之前加上ioff()命令。注意:是在生成图表之后、plt.show()之前!
实际使用时,这种方法也可用plt.show(block=False)方法替代,直接指定程序继续运行。
对于动态图的使用,参见:matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Pycharm环境中图像交互的相关设置
在Pycharm中,设置可交互图像显示模式,能达到与控制Matplotlib交互模式相同的效果。如下图:

关闭该模式时,运行生成图表会以可交互窗口形式打开,允许动态交互、拖动,满足了我们的使用要求。

打开该模式后,Pycharm会自动缓存show方法展示的图片,在右侧累叠。这样生成的是不可交互的静态图片,如下图。

实际使用时,通过切换这一设置可以灵活调整,从而不需修改代码来实现类似的模式切换。