Как вывести гистограму в 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_())

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

→ Ссылка