Как добавить несколько графиков на одну систему координат в 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())


