Как построить график внутри QGraphicsView?
Как с использованием matplotlib построить график внутри PyQt виджета QGraphicsView?
Прошу подскажите или направьте, не могу разобраться как это делается?
Ui:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(249, 332)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
self.graphicsView.setObjectName("graphicsView")
self.verticalLayout.addWidget(self.graphicsView)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 249, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
Код:
import sys
import matplotlib.pyplot as plt
from Ui_unt import Ui_MainWindow
from PyQt5 import QtCore, QtGui, QtWidgets
class TEST(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(TEST, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.graph)
def graph(self):
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
plt.plot(x, y)
plt.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ui = TEST()
ui.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я не знаю почему вы выбрали QGraphicsView для размещения графика,
но пусть будет так и выглядит это примерно так:
import sys
import random # +++
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
#import matplotlib.pyplot as plt
from matplotlib.figure import Figure # +++
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas # +++
#from Ui_unt import Ui_MainWindow
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(249, 332)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
self.graphicsView.setObjectName("graphicsView")
self.verticalLayout.addWidget(self.graphicsView)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 249, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
class TEST(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(TEST, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.graph)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.scene = QtWidgets.QGraphicsScene()
self.graphicsView.setScene(self.scene)
self.figure = Figure()
self.axes = self.figure.gca()
self.axes.set_title("My Plot")
def graph(self):
# x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
x = [ random.randrange(1, 100) for _ in range(10) ]
y = [ random.randrange(1, 100) for _ in range(10) ]
self.axes.clear()
self.axes.plot(x, y, "-k", label="График внутри виджета QGraphicsView")
self.axes.legend()
self.axes.grid(True)
self.canvas = FigureCanvas(self.figure)
self.proxy_widget = self.scene.addWidget(self.canvas)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ui = TEST()
ui.show()
sys.exit(app.exec_())

