关于Python的第三方库Matplotlib中plt.ion() & plt.ioff() & plt.savefig()函数的使用方法记录

tech2022-12-01  119


版权声明:本文为博主原创文章,如需转载请贴上原博文链接:https://blog.csdn.net/u011628215/article/details/108379046


前言:最近又把莫烦老师的PyTorch教学视频学习一遍,当使用PyTorch做回归练习的时候,想把整个神经网络训练做成模块(莫烦老师的教程中,只将建立神经网络定义了类——class Net(torch.nn.Module),我把训练过程、参数回传、优化器选择以及可视化分别做了函数),供以后直接调用,但是当做到可视化的时候,就遇到了问题,而问题就出在plt.ion()和plt.ioff()上。

注:from matplotlib import pyplot as plt

 

问题:莫烦老师的代码因为方便演示写成了一个整体(没有写成if __name__ == '__main__':的模块形式),所以运行没有问题;而当把代码做成单个的函数进行调用的时候,出现了可视化不连续的情况,即需要手动关闭figure窗口才能显示下一次训练的结果,如图1所示;

图1 运行的时候,训练一次就停住了

 

解决方法:直到写这个博客为止,我才发现是写函数的时候,plt.ioff()和plt.show()缩进错了,如图2所示。

图2 函数缩进出错

 

拓展1:既然知道哪里出错了,就好解决了!关键是,对于plt.ion()和plt.ioff()的用法,依然有含糊,所以借此机会巩固一下。(见参考文献)

拓展2:在看过参考文献后,依然有些不太明白,希望能有些官方的案例以供参考,如图3所示,是从“Matplotlib Release 3.1.1.pdf”中截取的片段。

图3 What is interactive mode?

 

TIPS:

1.两种模式还是蛮有意思的,从最后一个例子来看,阻塞模式(ioff,这个是默认模式)下,plt.show()的作用就像是plt.pause(∞),延时了无穷时间,需要把窗口关闭才能显示下一张图。

# 最后的例子,将plt.ioff()去掉后,效果一样 import numpy as np import matplotlib.pyplot as plt for i in range(3): plt.plot(np.random.rand(10)) plt.show() # plt.show()感觉很有意思,试试看下面的代码,在console中一步一步的run plt.ioff() # 此处的plt.ioff()可以省略,matplotlib中默认是阻塞式的 plt.figure() # 建立图像,但是并没有显示出来,控制台会出现“<Figure size 640x480 with 0 Axes>” plt.show() # 显示图像,此时程序阻塞,即控制台不能再输入代码,除非将这个窗口关闭 # 再试试看下面的,在console单步运行 plt.ion() # 开启交互模式 plt.figure() # 此时会弹出窗口,就好像输入了plt.show()一样,但是此时程序不阻塞 plt.show() # 当在控制台输入这个代码的同时,刚才的窗口已经被console控制台遮挡住了,敲完回车键后,刚才的窗口又出现在桌面最顶层了,此时程序也不阻塞,是不是很神奇!

2.如果还是不能理解ion和ioff的作用的话,不妨试试看下面的代码:

from matplotlib import pyplot as plt plt.ioff() # 开启阻塞模式 plt.figure() # 此时没有显示窗口 plt.ion() # 开启交互模式 plt.figure() # 此时显示窗口,并且弹出的窗口名称应该是“Figure2”,就好像plt.show()已经内置到plt.figure()中一样 plt.show() # 此时会将所有窗口全部显示,并且是按照刚才创建的顺序显示的Figure2在Figure1上层 # 如果觉得不明显的话,试试看这个 plt.ioff() plt.figure() plt.figure() plt.figure() plt.ion() plt.figure() # 这行代码运行后,会出现“Figure4” plt.show() # 显示四张图,Figure1在最底层,Figure4在最顶层

20201010更新:

    当需要保存显示出来的图片,但是又不想要在显示器上出现该图片(是不是有点绕!),例如:需要用plt.subplot()分块显示多张图,但并不想在显示器上看到这张图而只想保存它,怎么做呢?

# 举个例子:all_txt_file是一个12*10000的二维列表(<class 'list'>), # name是需要保存图片的名字(<class 'str'>) def data_display(all_txt_file, name): plt.ioff() # 注释这一行再试一次(如果不加这一行,窗口会被创建并显示在显示器上) plt.figure() plt.subplot(2, 6, 1) plt.plot(all_txt_file[0]) plt.grid() plt.subplot(2, 6, 2) plt.plot(all_txt_file[4]) plt.grid() plt.subplot(2, 6, 3) plt.plot(all_txt_file[6]) plt.grid() plt.subplot(2, 6, 4) plt.plot(all_txt_file[7]) plt.grid() plt.subplot(2, 6, 5) plt.plot(all_txt_file[8]) plt.grid() plt.subplot(2, 6, 6) plt.plot(all_txt_file[5]) plt.grid() plt.subplot(2, 6, 7) plt.plot(all_txt_file[3]) plt.grid() plt.subplot(2, 6, 8) plt.plot(all_txt_file[2]) plt.grid() plt.subplot(2, 6, 9) plt.plot(all_txt_file[1]) plt.grid() plt.subplot(2, 6, 10) plt.plot(all_txt_file[10]) plt.grid() plt.subplot(2, 6, 11) plt.plot(all_txt_file[9]) plt.grid() plt.subplot(2, 6, 12) plt.plot(all_txt_file[11]) plt.grid() plt.savefig('%s.jpg' % name) plt.close() if __name__ == '__main__': # all_txt_file = [[]] # 2维列表 name = 'picture' data_display(all_txt_file, name)

 

参考文献(感谢以下文献的贡献者们!):

1.matplotlib 画动态图以及plt.ion()和plt.ioff()的使用

2.matplotlib 学习笔记(4):ion 和 ioff

3.[matplotlib] plt.ion()的动态显示(附测试代码)

4.【matplotlib】 之 清理、清除 axes 和 figure (plt.cla、plt.clf、plt.close)

5.Python中读取,显示,保存图片的方法

最新回复(0)