Как добавить несколько графиков на одну систему координат в PyQtGraph

Нужно добавить несколько параметров на один график, пример сделанный в гугл таблице:

введите сюда описание изображения

На данный момент получилось сделать только один параметр:

введите сюда описание изображения

main.py

class EngineerGUI(QtWidgets.QMainWindow, Ui_EngineerGUI):
    def __init__(self):
        super(EngineerGUI, self).__init__()
        self.setupUi(self) # Инициализировать окно
        self.p1 = self.set_graph_ui() # Установить окно рисования
        self.btn.clicked.connect(self.graphic)# Нажмите кнопку, чтобы начать рисование

    def set_graph_ui(self):

        pg.setConfigOptions(antialias=True)

        win = pg.GraphicsLayoutWidget()

        self.graph_layout.addWidget(win)

        p1 = win.addPlot(title="Профиль трассы")
        p1.setLabel('left', text='Высота', color='white', units='м')
        p1.showGrid(x=True, y=True)
        p1.setLogMode(x=False, y=False)
        p1.setLabel('bottom', text='Расстояние', color='white', units='км')
        return p1

    def graphic(self):
        y_g = list_height
        x_g = list_width
        self.p1.plot(x_g, y_g, pen='r', name='Z', clear=True)

`gui.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_EngineerGUI(object):
    def setupUi(self, EngineerGUI):
        EngineerGUI.setObjectName("EngineerGUI")
        EngineerGUI.resize(1226, 792)
        self.btn = QtWidgets.QPushButton(EngineerGUI)
        self.btn.setGeometry(QtCore.QRect(260, 660, 291, 51))
        self.btn.setObjectName("btn")
        self.verticalLayoutWidget = QtWidgets.QWidget(EngineerGUI)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(120, 240, 791, 401))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.graph_layout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.graph_layout.setContentsMargins(0, 0, 0, 0)
        self.graph_layout.setObjectName("graph_layout")

        self.retranslateUi(EngineerGUI)
        QtCore.QMetaObject.connectSlotsByName(EngineerGUI)

    def retranslateUi(self, EngineerGUI):
        _translate = QtCore.QCoreApplication.translate
        EngineerGUI.setWindowTitle(_translate("EngineerGUI", "Отдел главного технолога"))
        self.btn.setText(_translate("EngineerGUI", "PushButton"))

Дополнительный вопрос:
Как сделать так, чтобы при повторном нажатии на кнопку график перестраивался заново(исходные данные для построения могут меняться в будущем).


Ответы (1 шт):

Автор решения: S. Nick

Если я правильно понял вас, то, как вариант, это может выглядеть так:

import sys
import numpy as np

from PyQt5 import QtWidgets, QtGui, QtCore  
from PyQt5.Qt import *

import pyqtgraph as pg


class Ui_EngineerGUI(object):
    def setupUi(self, EngineerGUI):
        EngineerGUI.setObjectName("EngineerGUI")
        EngineerGUI.resize(1100, 600)
        
        self.btn = QtWidgets.QPushButton(EngineerGUI)
        self.btn.setGeometry(QtCore.QRect(260, 660, 291, 51))
        self.btn.setObjectName("btn")
        
#        self.verticalLayoutWidget = QtWidgets.QWidget(EngineerGUI)
#        self.verticalLayoutWidget.setGeometry(QtCore.QRect(120, 240, 791, 401))
#        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")

#       self.graph_layout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.graph_layout = QtWidgets.QVBoxLayout(EngineerGUI)                 # +++
# ----------------------------------------------> ^^^^^^^^^^^ <---------------------        
        self.graph_layout.setContentsMargins(0, 0, 0, 0)
        self.graph_layout.setObjectName("graph_layout")

        self.retranslateUi(EngineerGUI)
        QtCore.QMetaObject.connectSlotsByName(EngineerGUI)

    def retranslateUi(self, EngineerGUI):
        _translate = QtCore.QCoreApplication.translate
        EngineerGUI.setWindowTitle(_translate("EngineerGUI", "Отдел главного технолога"))
        self.btn.setText(_translate("EngineerGUI", "Обновить график"))
        
        
#class MainWindow(QtWidgets.QMainWindow, Ui_EngineerGUI):
# --------------> v^v^v^v^v^v^v^v^v^v^v^ <----------------------------------------        
class MainWindow( QtWidgets.QWidget,      Ui_EngineerGUI):                   # !!!
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)    
        
        self.p1 = self.set_graph_ui()          
        
        self.graph_layout.addWidget(self.btn)                                # +++
        self.btn.clicked.connect(self.graphic) 

    def set_graph_ui(self):
        pg.setConfigOptions(antialias=True)

        win = pg.GraphicsLayoutWidget()
        self.graph_layout.addWidget(win)

        p1 = win.addPlot(title="Профиль трассы")
        p1.setLabel('left', text='Высота', color='white', units='м')
        p1.showGrid(x=True, y=True)
        p1.setLogMode(x=False, y=False)
        p1.setLabel('bottom', text='Расстояние', color='white', units='км')
        return p1

    def graphic(self):
        y = np.random.normal(size=10) * 10
        y2 = np.random.normal(size=10) * 10
        y3 = np.random.normal(size=10) * 10
        x = range(0, 10)

        c1 = self.p1.plot(x, y, 
            pen='b', symbol='x', symbolPen='b', 
            symbolBrush=0.2, name='red', clear=True)
        c2 = self.p1.plot(x, y2, 
            pen='r', symbol='o', symbolPen='r', 
            symbolBrush=0.2, name='blue')
        c3 = self.p1.plot(x, y3, pen='w', symbolBrush=1.0, name='Z')        
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(500, 400)
    w.show()
    sys.exit(app.exec())

введите сюда описание изображения

→ Ссылка