Обновление графика PyqtGraph в PyQt5
Я пишу небольшой интерфейс на PyQT5 в котором есть график, для создания которого я применяю PyQtGraph. График начинает отрисовываться по нажатию кнопки "Старт" и сначала все выглядит нормально:

Но с течением времени и увеличением количества точек, весь график сжимается в ширину экрана и становится не информативным:

В связи с этим есть два вопроса:
- Как я могу сделать, чтобы окно не пыталось уместить сразу весь график, сжимая его, а как бы двигалось за ним, показывая самые новые данные?
- Сейчас данные поступают раз в секунду и я каждый раз перерисовываю график заново. Возможно ли сделать его частичное обновление, чтобы я просто передавал в него только новые данные?
from pyqtgraph import PlotWidget
import pyqtgraph
from PyQt5 import QtCore
from PyQt5.QtCore import Qt, QThread, QTimer, QObject, pyqtSignal, QTimer
from PyQt5.QtWidgets import QHBoxLayout, QMainWindow, QPushButton, QVBoxLayout, QWidget, QApplication
import sys
import random
def get_kl_test():
choices = [50, 50, 50, 51, 51, 51, 52, 52, 52]
list = [random.choice(choices) for i in range(11)]
return list
def get_iopd_test():
choices = [40, 40, 40, 50, 50, 50, 60, 60, 60]
return random.choice(choices)
class Graph(PlotWidget):
def __init__(self):
super().__init__()
self.setBackground('white')
self.addLegend()
self.showGrid(x=True, y=True)
self.setYRange(0, 255, padding=0)
class ReadingWorker(QObject):
update_graph = pyqtSignal(list, list, list, list)
def __init__(self):
super().__init__()
self.time_from_start = 0
self.time_values = []
self.green_values = []
self.blue_values = []
self.red_values = []
def run(self):
self.read()
self.update_time()
def read(self):
ipd_values = get_kl_test()
iopd_value = get_iopd_test()
self.green_values.append(ipd_values[0])
self.blue_values.append(ipd_values[1])
self.red_values.append(iopd_value)
self.time_values.append(self.time_from_start)
self.update_graph.emit(
self.green_values, self.blue_values, self.red_values, self.time_values)
QTimer.singleShot(1000, self.read)
def update_time(self):
self.time_from_start += 1
QTimer.singleShot(1000, self.update_time)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.central_widget = QWidget(self)
self.setGeometry(50, 50, 1300, 700)
self.setCentralWidget(self.central_widget)
self.layout_main_window = QVBoxLayout()
self.central_widget.setLayout(self.layout_main_window)
# конфигурация тулбара
self.layout_toolbar = QHBoxLayout()
self.layout_toolbar.addStretch(1)
self.btn_start = QPushButton("Старт")
self.btn_start.clicked.connect(self.start)
self.layout_toolbar.addWidget(self.btn_start)
self.layout_main_window.addLayout(self.layout_toolbar)
# конфигурация графика
self.graph = Graph()
self.layout_main_window.addWidget(self.graph)
def start(self):
self.reading_thread = QThread(parent=self)
self.reading_widget = ReadingWorker()
self.reading_widget.moveToThread(self.reading_thread)
self.reading_widget.update_graph.connect(self.draw_graph)
self.reading_thread.started.connect(self.reading_widget.run)
self.reading_thread.start()
@QtCore.pyqtSlot(list, list, list, list)
def draw_graph(self, ipd_1_values, ipd_2_values, iopd_values, time_values):
self.graph.plotItem.clearPlots()
pen_ipd_1 = pyqtgraph.mkPen(color='green', width=4)
pen_ipd_2 = pyqtgraph.mkPen(color='blue', width=4, style=Qt.DashDotLine)
pen_iopd = pyqtgraph.mkPen(color='red', width=4, style=Qt.DashLine)
line_ipd_1 = self.graph.plotItem.addItem(pyqtgraph.PlotCurveItem(
time_values,
ipd_1_values,
pen=pen_ipd_1,
name='1'
))
line_ipd_2 = self.graph.plotItem.addItem(pyqtgraph.PlotCurveItem(
time_values,
ipd_2_values,
pen=pen_ipd_2,
name='2'
))
line_iopd = self.graph.plotItem.addItem(pyqtgraph.PlotCurveItem(
time_values,
iopd_values,
pen=pen_iopd,
name='3'
))
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle('Fusion')
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())