如何退出matplotlib并在此之后继续代码

3qpi33ja  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(119)

我的Python项目有问题。现在我正在使用Arduino和matplotlib的pyserial进行实时图形绘制。我想将Arduino的温度传感器数据绘制成实时图形。在我得到数据后,我想在关闭显示的图形后继续执行其他行代码。在这种情况下,我想在关闭图形显示后打印“ok”。下面是我使用的代码:

import serial
import matplotlib.pyplot as plt
import time

plt.ion()
fig=plt.figure()   
i=0
x1=list()
y1=list()
isrun = True
ser = serial.Serial('COM3',9600)
i=0
ser.close()
ser.open()
run = True

while True:
    data1 = ser.readline()
    print(data1.decode())
    x1.append(i)
    y1.append(data1.decode())
    plt.plot(x1, y1)
    plt.title('Temperature')
    i += 1
    plt.pause(0.005)
    plt.show(block=False)
    # if plt.close() :
    #     run= False
    #     ser.close()
    #     break

print('ok')

在这种情况下,关闭实时图表后,我无法打印“Ok”。即使在我关闭它之后,它仍然会继续显示图表。他们似乎一直在循环。我无法找到一种方法来打破循环并继续下一行代码。如何打破这种情况下的循环并继续打印'ok'。希望有人能帮忙。

a7qyws3x

a7qyws3x1#

您必须使用fig.canvas.mpl_connect()捕获按键事件

fig = plt.figure()
keep_ploting = True

def on_key(event):
    global keep_ploting 
    keep_ploting = False

while keep_ploting:
    data1 = ser.readline()
    print(data1.decode())
    x1.append(i)
    y1.append(data1.decode())
    plt.plot(x1, y1)
    plt.title('Temperature')
    i += 1
    plt.pause(0.005)
    plt.show(block=False)
    
    fig.canvas.mpl_connect('key_press_event', on_key)

在这种情况下,它在任何键事件之后中断循环,您可以定义一个指定键来中断循环或采取某些操作。
this question是关于鼠标点击事件的,但你会发现更多有用的信息。

dkqlctbz

dkqlctbz2#

close event更适合你的任务。由于plt.pasue()也会触发此事件,因此您可以使用其他命令来更新您的图形。
其逻辑是:首先画一个图,不要关闭它。在每次迭代中,您只需更新数据并重新绘制它。这比每次迭代中的显示/关闭图形更快。
但是,如果您想使绘图与COM 3事件同步,这仍然是困难的,因为仍然会有延迟。
您可以参考Fast Live Plotting in Matplotlib / PyPlot以使更新更快。
以下是我的demo:

import matplotlib.pyplot as plt
import numpy as np
import time

close_flag = 0

x = np.arange(0, 10)
y = np.arange(0, 10)

# to handle close event.
def handle_close(evt):
    global close_flag # should be global variable to change the outside close_flag.
    close_flag = 1
    print('Closed Figure!')

plt.ion()
fig, ax = plt.subplots()
fig.canvas.mpl_connect('close_event', handle_close) # listen to close event
line, = plt.plot(x, y)

t = 0
delta_t = 0.1
while close_flag == 0:
    if abs(t - round(t)) < 1e-5:
        print(round(t))
    
    x = x + delta_t
    y = y - delta_t
    line.set_data(x, y) # change the data in the line.
    
    ax.relim() # recompute the axes limits.
    ax.autoscale_view() # update the axes limits.
    
    fig.canvas.draw() # draw the figure
    fig.canvas.flush_events() # flush the GUI events for the figure.
    # plt.show(block=False)
    time.sleep(delta_t) # wait a little bit of time
    
    t += delta_t
    
    if close_flag == 1:
        break

print('ok')

相关问题