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


版权声明:本文为博主原创文章,如需转载请贴上原博文链接: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所示;

关于Python的第三方库Matplotlib中plt.ion()和plt.ioff()函数的使用方法记录_第1张图片 图1 运行的时候,训练一次就停住了

 

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

关于Python的第三方库Matplotlib中plt.ion()和plt.ioff()函数的使用方法记录_第2张图片 图2 函数缩进出错

 

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

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

关于Python的第三方库Matplotlib中plt.ion()和plt.ioff()函数的使用方法记录_第3张图片 图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()    # 建立图像,但是并没有显示出来,控制台会出现“
” 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在最顶层

 

 

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

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)

你可能感兴趣的:(问题及解决方案,学习记录,python,matplotlib,可视化,神经网络)