pyqt matplotlib实现X轴为实时时间滚动
时间: 2024-10-17 14:05:42 浏览: 23
在PyQt和Matplotlib结合使用时,要实现在X轴显示实时滚动的时间,你可以通过`pyqtgraph.Qt`库创建一个QThread子线程,将数据生成和更新绘图任务分离到后台运行,同时利用`matplotlib.backends.backend_qt5agg.FigureCanvasQTAgg`或类似组件来显示实时更新的图表。以下是基本步骤:
1. 导入必要的库:
```python
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QTimer, QThread
import matplotlib.pyplot as plt
from datetime import datetime
import numpy as np
```
2. 创建一个实时数据生成器(这里用numpy生成简单时间序列):
```python
def generate_data():
while True:
yield datetime.now(), np.random.rand() # 返回当前时间和随机数对
```
3. 在主窗口中设置绘图区域,并创建一个线程用于绘制:
```python
class UpdateThread(QThread):
data_signal = pyqtSignal(tuple)
def __init__(self, parent=None):
super().__init__(parent)
self.data_generator = generate_data()
def run(self):
while True:
new_data = next(self.data_generator) # 获取新数据
self.data_signal.emit(new_data) # 发出信号
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建线程实例并连接信号
self.update_thread = UpdateThread()
self.update_thread.data_signal.connect(self.update_plot)
# 设置图形界面
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_autoscale_on(False) # 防止自动缩放影响时间轴
line, = ax.plot([], [], 'r') # 空列表存储线条数据
timer = QTimer(self)
timer.timeout.connect(self.update_data)
timer.start(100) # 每隔100ms更新一次
def update_plot(self, data):
x, y = data
line.set_xdata([x] + line.get_xdata()) # 添加新的X值
line.set_ydata([y] + line.get_ydata())
ax.relim() # 更新范围
ax.autoscale_view(True, True, False) # 不自动缩放Y轴
self.canvas.draw_idle() # 异步更新canvas
def update_data(self):
if self.update_thread.isRunning():
self.update_thread.quit() # 结束循环,防止无限递归
else:
self.update_thread.start() # 开始新的循环获取数据
if __name__ == "__main__":
app = QApplication(sys.argv)
main_win = MainWindow()
main_win.show()
sys.exit(app.exec_())
```
在这个例子中,`UpdateThread`负责不断生成数据并发送信号,`MainWindow`接收信号并在主线程中更新绘图。`update_plot`函数处理接收到的数据,更新线图的X轴和Y轴数据。
阅读全文