下面是关于“matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解”的完整攻略:
Matplotlib 是 Python 语言中广泛使用的数据可视化库之一,主要用于绘制静态图表。但是在某些情况下,我们需要绘制一些动态图,如实时地展示传感器的采集数据等。这时候,Matplotlib 就需要使用到其动态图绘制功能。
Matplotlib 的动态图绘制功能可以使用 FuncAnimation 函数来实现。其主要原理为,在绘制动态图时,通过一系列帧(frames)来实现动态变化,每一帧都是一张静态图像,多个帧连续展示就实现了动态效果。
在使用 Matplotlib 进行动态图绘制时,为了让静态图像显示出来,需要手动的使用 plt.show()
函数。但是,如果我们每次绘制完一个新的帧后都调用该函数,则非常耗费时间,并且会使绘图界面出现严重的卡顿。这时候,我们需要使用 plt.ion() 和 plt.ioff() 函数,并结合 Matplotlib 的对象-oriented 绘图方法,来切换动态绘图模式和静态绘图模式。
plt.ion()
当我们调用 plt.ion() 后,Matplotlib 便会进入动态绘图模式。在该模式下,每执行一次绘图时,都不需要调用 show(),图片会自动更新。这种绘图方式通常用于实时数据处理和绘制动态数据图表等,具有实时性。
plt.ioff()
当我们调用 plt.ioff()
后,Matplotlib 便会进入静态绘图模式。在该模式下,Matplotlib 不会自动更新图片,而需要手动使用 plt.show()
函数进行显示,这种绘图方式主要用于静态数据展示和打印出来的图形。
下面我们分别通过两个示例来演示 plt.ion() 和 plt.ioff() 的使用方法:
import numpy as np
import matplotlib.pyplot as plt
# 设置绘图模式为动态模式
plt.ion()
fig, ax = plt.subplots()
x = np.linspace(-10, 10, 200)
for i in range(200):
y = np.sin(x + i / 10.0)
# 清除上一次的曲线
ax.clear()
# 绘制新的曲线
ax.plot(x, y)
# 刷新画布
plt.draw()
# 暂停一段时间
plt.pause(0.1)
# 设置绘图模式为静态模式
plt.ioff()
# 显示图形
plt.show()
该示例中,我们利用 Matplotlib 绘制了一条随时间变化的正弦曲线。在绘制正弦曲线时,我们先调用 plt.ion()
函数将 Matplotlib 切换到动态绘图模式,然后通过 for 循环实现一帧一帧的绘制,清除上一帧的曲线,绘制新的曲线,刷新画布,并暂停 0.1 秒,循环下一帧的绘制。最后,我们调用 plt.ioff()
将 Matplotlib 切换为静态绘图模式,最终显示绘制出来的正弦曲线。
import serial
import numpy as np
import matplotlib.pyplot as plt
# 打开串口
ser = serial.Serial('COM3', 115200, timeout=0.5)
# 设置绘图模式为动态模式
plt.ion()
fig, ax = plt.subplots()
x = np.linspace(0, 50, 100)
y = np.zeros_like(x)
while True:
# 读取串口数据
data = ser.readline()
try:
# 将数据转换为浮点数
value = float(data.decode('utf-8').rstrip())
# 移动数据数组
y[1:] = y[:-1]
# 将新数据添加到数组末尾
y[0] = value
# 清除上一次图像
ax.clear()
# 绘制新图像
ax.plot(x, y)
# 刷新画布
plt.draw()
# 暂停一段时间
plt.pause(0.1)
except ValueError:
pass
# 关闭串口
ser.close()
# 设置绘图模式为静态模式
plt.ioff()
# 显示图形
plt.show()
该示例中,我们通过使用 pyserial 库向串口发送数据,并使用 Matplotlib 实时展示传感器的数据。在该程序中,我们先调用 plt.ion()
函数将 Matplotlib 切换到动态绘图模式,然后通过一个 while 循环不断的读取串口数据,并清除上一次数据的图像,绘制新的图像,并刷新画布。最后,我们调用 plt.ioff()
将 Matplotlib 切换为静态绘图模式,最终显示绘制出来的实时数据图表。
以上就是关于“matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解”的完整攻略。希望对您有所帮助!
本文链接:http://task.lmcjl.com/news/14868.html