Как изменить размер графика plotly на дочернем окне приложения PyQt5?

Я хотел настроить plotly график в дочернем макете приложения таким образом, чтобы у него автоматически изменялся размер вместе с главным окном.

Хотелось бы увидеть такую конфигурацию графика

У меня есть следующие объекты в моем файле .ui: объект инспектора .ui

Полный код в репозитори https://github.com/catauggie/PyQt5

Здесь привожу фрагемент той части, которая. на мой взгляд, наиболее значима в этом вопросе, а именно функция отрисовки графика:

    def plotter(self):
        df_period = self.all_data.loc[:len(self.all_data)-13]
        df_predict = self.all_data.loc[len(self.all_data)-12:]
        fig = go.Figure()
        fig.add_trace(go.Scatter(x=df_period.index, y=df_period['value'], mode='lines', name='value'))
        fig.add_trace(go.Scatter(x=df_predict.index, y=df_predict['value'], mode='lines', opacity=0.7, name='value_true'))
        fig.add_trace(go.Scatter(x=df_predict.index, y=df_predict['value_predict'], mode='lines',  name='value_predict'))
        self.browser.setHtml(fig.to_html(include_plotlyjs='cdn'))
        #self.vlayout().addWidget(self.browser)

И то, как она вызывается при нажатии кнопки:

class MainWindow(QWidget, From_Main):
    def __init__(self):
        super(MainWindow, self).__init__()
        QWidget.__init__(self)
        self.setupUi(self)
        
        self.browser = QtWebEngineWidgets.QWebEngineView(self)
        self.horizontalLayout_2.addWidget(self.browser)

        self.ButtonOpen.clicked.connect(self.OpenFile)
        self.BtnDescribe.clicked.connect(self.dataHead)
        self.BtnDescribe.clicked.connect(self.prediction)
        self.BtnDescribe.clicked.connect(self.dataHead2)
        self.pushButton_3.clicked.connect(self.predict_model_v2)
        self.pushButton_3.clicked.connect(self.plotter)


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

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

Я не смог проверить ваш пример.
Я сконвертировал ваш модуль Main_modified3.ui в main_modified3_ui.py:

pyuic5 Main_modified3.ui -o main_modified3_ui.py -x

и вручную внес изменения в main_modified3_ui.py. Вы это можете сделать в Qt Designere.

Обратите внимание, я добавил менеджер компоновки self.v_layout, в который добавлены self.label_3 и self.horizontalLayoutWidget.

Виджет self.horizontalLayoutWidget имеет макет self.horizontalLayout_2, в который мы и будем добавлять график.

Возможный вариант решения вашей задачи, выглядит так:

main.py

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

from main_modified3_ui import Ui_Form                                   # !!!

from matplotlib.backends.backend_qt5agg import FigureCanvas             # !!!
from matplotlib.figure import Figure                                    # !!!


class MainWindow(QWidget, Ui_Form):
    def __init__(self):
        super(MainWindow, self).__init__()
        QWidget.__init__(self)
        self.setupUi(self)
        
        canvas = FigureCanvas(Figure(figsize=(5, 3)))
        canvas.setMinimumHeight(190)      
        ax = canvas.figure.subplots()
        ax.plot([1, 2, 3, 4])
        
        self.horizontalLayout_2.addWidget(canvas)                       # !!!
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

main_modified3_ui.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(1200, 800)
        Form.setStyleSheet("")
        self.horizontalLayout = QtWidgets.QHBoxLayout(Form)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.ButtonOpen = QtWidgets.QPushButton(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.ButtonOpen.sizePolicy().hasHeightForWidth())
        self.ButtonOpen.setSizePolicy(sizePolicy)
        self.ButtonOpen.setMinimumSize(QtCore.QSize(54, 26))
        font = QtGui.QFont()
        font.setPointSize(13)
        font.setBold(True)
        font.setWeight(75)
        self.ButtonOpen.setFont(font)
        self.ButtonOpen.setStyleSheet("\n"
"selection-background-color: rgb(255, 68, 21);\n"
"border-color: rgb(255, 97, 100);")

        icon = QtGui.QIcon()
# установите свое изобраажение        vvvvvvvv
        icon.addPixmap(QtGui.QPixmap("ball.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.ButtonOpen.setIcon(icon)
        self.ButtonOpen.setIconSize(QtCore.QSize(50, 14))
        
        self.ButtonOpen.setCheckable(False)
        self.ButtonOpen.setAutoRepeat(False)
        self.ButtonOpen.setDefault(True)
        self.ButtonOpen.setFlat(True)
        self.ButtonOpen.setObjectName("ButtonOpen")
        self.gridLayout.addWidget(self.ButtonOpen, 0, 0, 2, 1)
        self.tabWidget = QtWidgets.QTabWidget(Form)
        font = QtGui.QFont()
        font.setPointSize(13)
        self.tabWidget.setFont(font)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.tab)
        self.gridLayout_2.setObjectName("gridLayout_2")
        
# ??? -----> vvvvvvv <---- неправильное имя, это не `layout` - это `widget`
        self.vlayout = QtWidgets.QWidget(self.tab)
        self.vlayout.setEnabled(True)
        self.vlayout.setObjectName("vlayout")
        self.vlayout.setStyleSheet('background-color: #008CD9;')          # +
# +++        
        self.v_layout = QtWidgets.QVBoxLayout(self.vlayout)               # +++
        self.v_layout.setContentsMargins(0, 0, 0, 0)                      # +++
        self.v_layout.setSpacing(0)                                       # +++
      
        self.label_3 = QtWidgets.QLabel(self.vlayout)
        self.label_3.setGeometry(QtCore.QRect(10, 20, 431, 551))
        self.label_3.setText("")
# установите свое изобраажение                vvvvvvvvv
        self.label_3.setPixmap(QtGui.QPixmap("boy33.png")) # установите свое изобраажение
        self.label_3.setScaledContents(True)               # ?
        self.label_3.setObjectName("label_3")
# +++        
        self.v_layout.addWidget(self.label_3, 0)                                # +++        
      
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.vlayout)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 220, 441, 581))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayoutWidget.setStyleSheet('background-color: #D98C00;') # +
        
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
# +++        
        self.v_layout.addWidget(self.horizontalLayoutWidget, 1)                  # +++

        self.gridLayout_2.addWidget(self.vlayout, 3, 9, 2, 1)
        
        self.label = QtWidgets.QLabel(self.tab)
        self.label.setObjectName("label")
        self.gridLayout_2.addWidget(self.label, 0, 2, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem, 0, 9, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.tab)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout_2.addWidget(self.pushButton, 2, 5, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.tab)
        self.label_2.setObjectName("label_2")
        self.gridLayout_2.addWidget(self.label_2, 0, 5, 1, 1, QtCore.Qt.AlignLeft)
        self.tableWidget_2 = QtWidgets.QTableWidget(self.tab)
        self.tableWidget_2.setEnabled(True)
        self.tableWidget_2.setObjectName("tableWidget_2")
        self.tableWidget_2.setColumnCount(0)
        self.tableWidget_2.setRowCount(0)
        self.gridLayout_2.addWidget(self.tableWidget_2, 4, 5, 1, 1)
        self.tableWidget = QtWidgets.QTableWidget(self.tab)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.gridLayout_2.addWidget(self.tableWidget, 4, 0, 1, 5)
        self.spinBox_2 = QtWidgets.QSpinBox(self.tab)
        self.spinBox_2.setObjectName("spinBox_2")
        self.gridLayout_2.addWidget(self.spinBox_2, 1, 5, 1, 1)
        self.BtnDescribe = QtWidgets.QPushButton(self.tab)
        font = QtGui.QFont()
        font.setPointSize(9)
        self.BtnDescribe.setFont(font)
        self.BtnDescribe.setObjectName("BtnDescribe")
        self.gridLayout_2.addWidget(self.BtnDescribe, 2, 1, 1, 1)
        self.spinBox = QtWidgets.QSpinBox(self.tab)
        self.spinBox.setMaximumSize(QtCore.QSize(75, 27))
        self.spinBox.setObjectName("spinBox")
        self.gridLayout_2.addWidget(self.spinBox, 1, 3, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.tab)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout_2.addWidget(self.pushButton_2, 2, 2, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(self.tab)
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout_2.addWidget(self.pushButton_3, 1, 9, 1, 1)
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_2)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.tabWidget.addTab(self.tab_2, "")
        self.gridLayout.addWidget(self.tabWidget, 2, 0, 1, 2)
        self.horizontalLayout.addLayout(self.gridLayout)

        self.retranslateUi(Form)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.ButtonOpen.setText(_translate("Form", "Open CSV"))
        self.label.setText(_translate("Form", "Columns"))
        self.pushButton.setText(_translate("Form", "Describe"))
        self.label_2.setText(_translate("Form", "Columns"))
        self.BtnDescribe.setText(_translate("Form", "Describe"))
        self.pushButton_2.setText(_translate("Form", "Convert"))
        self.pushButton_3.setText(_translate("Form", "Visualisation"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "Describe data"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Form", "Plot Data"))

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

→ Ссылка