关键词

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

下面是关于“matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解”的完整攻略:

1. matplotlib 画动态图简介

Matplotlib 是 Python 语言中广泛使用的数据可视化库之一,主要用于绘制静态图表。但是在某些情况下,我们需要绘制一些动态图,如实时地展示传感器的采集数据等。这时候,Matplotlib 就需要使用到其动态图绘制功能。

Matplotlib 的动态图绘制功能可以使用 FuncAnimation 函数来实现。其主要原理为,在绘制动态图时,通过一系列帧(frames)来实现动态变化,每一帧都是一张静态图像,多个帧连续展示就实现了动态效果。

2. plt.ion()和plt.ioff()的作用

在使用 Matplotlib 进行动态图绘制时,为了让静态图像显示出来,需要手动的使用 plt.show() 函数。但是,如果我们每次绘制完一个新的帧后都调用该函数,则非常耗费时间,并且会使绘图界面出现严重的卡顿。这时候,我们需要使用 plt.ion() 和 plt.ioff() 函数,并结合 Matplotlib 的对象-oriented 绘图方法,来切换动态绘图模式和静态绘图模式。

  • plt.ion()

当我们调用 plt.ion() 后,Matplotlib 便会进入动态绘图模式。在该模式下,每执行一次绘图时,都不需要调用 show(),图片会自动更新。这种绘图方式通常用于实时数据处理和绘制动态数据图表等,具有实时性。

  • plt.ioff()

当我们调用 plt.ioff() 后,Matplotlib 便会进入静态绘图模式。在该模式下,Matplotlib 不会自动更新图片,而需要手动使用 plt.show() 函数进行显示,这种绘图方式主要用于静态数据展示和打印出来的图形。

3. plt.ion() 与 plt.ioff() 的使用示例

下面我们分别通过两个示例来演示 plt.ion() 和 plt.ioff() 的使用方法:

示例1:动态绘制正弦曲线

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 切换为静态绘图模式,最终显示绘制出来的正弦曲线。

示例2:实时展示传感器数据

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

展开阅读全文