Как вывести гистограму в QFrame?
Как сделать так, чтобы построенная гистограма отображалась в QFrame (insert_framehis?
Сейчас создается график и вставляется в insert_frame. Но он не похож на диаграму частот. Под диаграмой частот иммею ввиду следующее:
Допустим есть масив ages = [10, 10, 30, 40, 50, 50, 50]. Нужно, что б на диаграме числу 10(по оси Х) отвечало число 2(по оси Y), по аналогии 30-1, 40-1, 50-3. Нужно, что б получилось на подобии єтого.

ui_example.py:
#from ui_example import Ui_DialogWindowAccept
import sys
import matplotlib
matplotlib.use('agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import random
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_DialogWindowAccept(object):
def setupUi(self, DialogWindowAccept):
DialogWindowAccept.setObjectName("DialogWindowAccept")
DialogWindowAccept.resize(620, 520)
DialogWindowAccept.setMinimumSize(QtCore.QSize(0, 0))
DialogWindowAccept.setMaximumSize(QtCore.QSize(16000, 16000))
self.centralwidget = QtWidgets.QWidget(DialogWindowAccept)
self.centralwidget.setMaximumSize(QtCore.QSize(16000, 16000))
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(0)
self.verticalLayout.setObjectName("verticalLayout")
self.header = QtWidgets.QFrame(self.centralwidget)
self.header.setMinimumSize(QtCore.QSize(0, 70))
self.header.setMaximumSize(QtCore.QSize(16777215, 70))
self.header.setStyleSheet("")
self.header.setFrameShape(QtWidgets.QFrame.NoFrame)
self.header.setFrameShadow(QtWidgets.QFrame.Raised)
self.header.setObjectName("header")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.header)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.header)
self.label.setStyleSheet("")
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.verticalLayout.addWidget(self.header)
self.insert_frame = QtWidgets.QFrame(self.centralwidget)
self.insert_frame.setMinimumSize(QtCore.QSize(600, 310))
self.insert_frame.setFrameShape(QtWidgets.QFrame.NoFrame)
self.insert_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.insert_frame.setObjectName("insert_frame")
self.verticalLayout.addWidget(self.insert_frame)
DialogWindowAccept.setCentralWidget(self.centralwidget)
self.retranslateUi(DialogWindowAccept)
QtCore.QMetaObject.connectSlotsByName(DialogWindowAccept)
def retranslateUi(self, DialogWindowAccept):
_translate = QtCore.QCoreApplication.translate
DialogWindowAccept.setWindowTitle(_translate("DialogWindowAccept", "MainWindow"))
self.label.setText(_translate("DialogWindowAccept", "Example"))
main.py:
class MplCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
class GraphWindow(QtWidgets.QMainWindow, Ui_DialogWindowAccept):
def __init__(self):
super().__init__()
self.setupUi(self)
self.canvas = MplCanvas(self, width=5, height=4, dpi=100)
hlayout = QtWidgets.QHBoxLayout(self.insert_frame)
hlayout.addWidget(self.canvas)
self.update_plot()
def update_plot(self):
self.canvas.axes.cla()
ages = [10, 10, 10, 40, 50, 60, 60, 80, 90, 100]
self.canvas.axes.hist(ages, density=1, facecolor="green", alpha=0.75)
self.canvas.axes.grid(True)
self.canvas.draw()
Привел минимальный воспроизводимый пример.
Структура в Qt Designer:
DialogWindowAccept->centralwidget->header(->label), insert_frame
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я не уверен, что понял, какую диаграмму частот вы хотите нарисовать, но попробуйте так:
import sys
import random
import numpy as np
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
import matplotlib
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
class Ui_DialogWindowAccept(object):
def setupUi(self, DialogWindowAccept):
DialogWindowAccept.setObjectName("DialogWindowAccept")
DialogWindowAccept.resize(620, 520)
DialogWindowAccept.setMinimumSize(QtCore.QSize(0, 0))
DialogWindowAccept.setMaximumSize(QtCore.QSize(16000, 16000))
self.centralwidget = QtWidgets.QWidget(DialogWindowAccept)
self.centralwidget.setMaximumSize(QtCore.QSize(16000, 16000))
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(0)
self.verticalLayout.setObjectName("verticalLayout")
self.header = QtWidgets.QFrame(self.centralwidget)
self.header.setMinimumSize(QtCore.QSize(0, 70))
self.header.setMaximumSize(QtCore.QSize(16777215, 70))
self.header.setStyleSheet("")
self.header.setFrameShape(QtWidgets.QFrame.NoFrame)
self.header.setFrameShadow(QtWidgets.QFrame.Raised)
self.header.setObjectName("header")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.header)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.header)
self.label.setStyleSheet("")
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.verticalLayout.addWidget(self.header)
self.insert_frame = QtWidgets.QFrame(self.centralwidget)
self.insert_frame.setMinimumSize(QtCore.QSize(600, 310))
self.insert_frame.setFrameShape(QtWidgets.QFrame.NoFrame)
self.insert_frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.insert_frame.setObjectName("insert_frame")
self.verticalLayout.addWidget(self.insert_frame)
DialogWindowAccept.setCentralWidget(self.centralwidget)
self.retranslateUi(DialogWindowAccept)
QtCore.QMetaObject.connectSlotsByName(DialogWindowAccept)
def retranslateUi(self, DialogWindowAccept):
_translate = QtCore.QCoreApplication.translate
DialogWindowAccept.setWindowTitle(_translate("DialogWindowAccept", "MainWindow"))
self.label.setText(_translate("DialogWindowAccept", "Example"))
class MplCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
class GraphWindow(QtWidgets.QMainWindow, Ui_DialogWindowAccept):
def __init__(self):
super().__init__()
self.setupUi(self)
self.canvas = MplCanvas(self, width=5, height=4, dpi=100)
hlayout = QtWidgets.QHBoxLayout(self.insert_frame)
hlayout.addWidget(self.canvas)
self.x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# self.update_plot()
self.timer = QtCore.QTimer()
self.timer.setInterval(1000)
self.timer.timeout.connect(self.update_plot)
self.timer.start()
def update_plot(self):
myArray = [random.randint(0, 10) for i in range(6)]
y = np.array(myArray)
self.canvas.axes.cla()
self.canvas.axes.hist(
y,
self.x,
density=1,
facecolor="green",
alpha=0.75
)
self.canvas.axes.grid(True)
self.canvas.draw()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = GraphWindow()
w.show()
sys.exit(app.exec_())
