有没有办法分离 matplotlib 图以便计算可以继续?
有几种方法可以在使用 matplotlib 进行图形绘制时继续计算或处理其他任务。这些方法可以让你在与图形交互的同时,继续进行计算,避免程序在绘图时被阻塞。
matplotlib
plt.ion()
Matplotlib 的交互模式允许你在脚本继续运行时与图形进行交互。这是一种简单的方法,适合用于需要动态更新图形的场景。
import matplotlib.pyplot as plt import time # 启用交互模式 plt.ion() # 创建图形和坐标轴 fig, ax = plt.subplots() line, = ax.plot([1, 2, 3], [4, 5, 6]) # 显示图形 plt.draw() plt.pause(0.1) # 暂停以允许图形更新 # 执行长时间计算 for i in range(10): # 更新图形(如果需要) line.set_ydata([4+i, 5+i, 6+i]) plt.draw() plt.pause(0.5) # 暂停以允许图形更新 print(f"Step {i+1} complete") # 关闭交互模式(可选) plt.ioff() plt.show()
如果你的计算非常长,并且你希望图形在主线程中继续响应,可以使用 threading 模块在后台线程中执行计算。
threading
import matplotlib.pyplot as plt import threading import time def long_running_calculations(): for i in range(10): # 模拟长时间计算 time.sleep(1) print(f"Step {i+1} complete") # 创建图形和坐标轴 fig, ax = plt.subplots() ax.plot([1, 2, 3], [4, 5, 6]) plt.draw() plt.pause(0.1) # 暂停以允许图形更新 # 在后台线程中启动长时间计算 thread = threading.Thread(target=long_running_calculations) thread.start() # 显示图形 plt.show()
Tkinter
另一种方法是将 Matplotlib 嵌入到 Tkinter 窗口中,并使用 Tkinter 的事件循环来处理图形更新。这种方法允许图形和计算在不同的事件循环中进行。
import matplotlib.pyplot as plt import matplotlib.backends.backend_tkagg as tkagg import tkinter as tk import time def long_running_calculations(): for i in range(10): # 模拟长时间计算 time.sleep(1) print(f"Step {i+1} complete") # 创建 Tkinter 窗口 root = tk.Tk() root.title("Matplotlib in Tkinter") # 创建图形和坐标轴 fig, ax = plt.subplots() line, = ax.plot([1, 2, 3], [4, 5, 6]) # 嵌入 Matplotlib 图形到 Tkinter 窗口中 canvas = tkagg.FigureCanvasTkAgg(fig, master=root) canvas.draw() canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) # 在后台线程中启动长时间计算 thread = threading.Thread(target=long_running_calculations) thread.start() # 启动 Tkinter 事件循环 root.mainloop()
这些方法可以帮助你在使用 Matplotlib 绘图时继续进行其他计算,避免程序在图形显示期间被阻塞。