Как изменить размер графика 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 шт):
Я не смог проверить ваш пример.
Я сконвертировал ваш модуль 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"))
