matplotlib 按键退出实时绘图

kkbh8khc  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(95)

我已经做了一个程序,从网络分析仪现场绘图数据。图形的绘制在while循环内。除非关闭程序,否则程序不会停止打印。我想要一个程序,当我按下键盘上的按钮时,它会关闭图形(breakwhile循环)。我不想使用input,因为这样代码就会等待输入。在按下按钮之前,代码应平稳运行。我在桑尼的乌藨子派上做这个项目。

import matplotlib.pyplot as plt

plt.ion()

x_data= []
y_data= []

graph= plt.plot(x_data,y_data)

while True:

  do something

  graph.set_ydata(y_data)
  graph.set_xdata(x_data)
  plt.draw()
  plt.pause(0.01)

字符串
注意这不是代码,只是一个小例子;问题不在于绘图,而在于尝试break循环。

uelo1irk

uelo1irk1#

考虑到这段代码需要在乌藨子上运行.
使用***键盘模块***可能不是一个好主意,因为在Linux上,程序的执行可能会突然要求root访问权限,以便与设备驱动程序交互并侦听键盘事件。
要使命令“sudo python my_script.py”正常工作,可能需要进一步调整。
因此,这里是我的简单解决方案,利用线程和std input()函数,以避免使用键盘库和关闭Python程序。
正如@jared所建议的那样,最好选择一个任意的键来实现所需的结果,而不是任何键。

片段:

import matplotlib.pyplot as plt
import threading

# Empty data for now
x_data = []
y_data = []

############## Plotting 
# Enable the interactive mode for plotting
plt.ion() 
# The comma after "graph" is fundamental to unpack the first element of the returned tuple 
# and assigning it to the variable graph.
# (Without the comma, graph would be assigned to the entire tuple)
graph, = plt.plot(x_data, y_data)

def keyboard_input():
    """ It is not necessary to specify the 'q' key, 
    since input() waits for the user to enter a value and press enter,  
    but if the value entered is "q", the function return and then the subsequent code is executed.
    """
    input()
    plt.close()

# Start the thread that execute the keyboard input method
thread = threading.Thread(target=keyboard_input)
thread.start()

# Display the plot. It is constantly updated in real-time as new data can be, someway, added to x_data and y_data
while True:
    graph.set_ydata(y_data)
    graph.set_xdata(x_data)
    plt.draw()
    plt.pause(0.01)
    # Check if the plot window (with the specified figure number 1, the default value) has been closed, 
    # Otherwise, waits for the thread object to complete the join() method and exit
    if not plt.fignum_exists(1):
        thread.join()
        break

字符串

f0brbegy

f0brbegy2#

在任何按键下退出可能会有点烦人。我建议选择一个特定的键来退出。在下面的例子中,我使用"q"键来“退出”。使用keyboard python library(您可能需要安装)完成检测。

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

plt.close("all")

plt.ion()

rng = np.random.default_rng(42)
N = 10
x_data = np.linspace(0, 5, N)
y_data = rng.random(N)

line, = plt.plot(x_data, y_data)

while True:
    if keyboard.is_pressed("q"):
        break    
    
    line.set_ydata(rng.random(N))
    plt.draw()
    plt.pause(0.01)

print("End of code")

字符串

相关问题