Я использую PyQt5 для создания пользовательского интерфейса для отображения данных из метода "curve_fit".

Поскольку данные, с которыми я работаю, могут иметь разрывы, мой возврат от метода разделен на срезы кривой.

Мой графический интерфейс состоит из двух графиков и одного поля со списком. Функция поля со списком состоит в том, чтобы позволить пользователю выбрать, какой фрагмент будет отображаться на диаграмме. Хотя событие поля со списком работает, мои диаграммы остались прежними, без каких-либо изменений.

Main.py

import sys
from PyQt5 import QtWidgets
import numpy as np

from mainwindow import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self,
                 initial_curve_x_value, initial_curve_y_value,
                 fit_curve_x_value_list, fit_curve_y_value_list,
                 fit_curve_error_value_list, fit_curve_zero_list,
                 fit_parameter_list, fit_square_R_list,
                 parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

        self.initial_curve_x_value = initial_curve_x_value
        self.initial_curve_y_value = initial_curve_y_value
        self.fit_curve_x_value_list = fit_curve_x_value_list
        self.fit_curve_y_value_list = fit_curve_y_value_list
        self.fit_curve_error_value_list = fit_curve_error_value_list
        self.fit_curve_zero_list = fit_curve_zero_list
        self.fit_parameter_list = fit_parameter_list
        self.fit_square_R_list = fit_square_R_list

        rangecombobox = len(fit_square_R_list)
        itenscombobox = ["Slice " + str(i+1) for i in range(rangecombobox)]
        self.combobox.addItems(itenscombobox)
        #setting as initial value in chart as the first slice
        initial = 0
        x_test = self.initial_curve_x_value[initial]
        y_test = self.initial_curve_y_value[initial]
        x2_test = self.fit_curve_x_value_list[initial]
        y2_test = self.fit_curve_y_value_list[initial]
        error_y = self.fit_curve_error_value_list[initial]
        zero_y = self.fit_curve_zero_list[initial]

        self.static_ax1.plot(x_test, y_test)
        self.static_ax1.plot(x2_test, y2_test)

        self.static_ax2.plot(x2_test, error_y)
        self.static_ax2.plot(x2_test, zero_y)

        self.combobox.currentIndexChanged.connect(self.changePlot)

    def changePlot(self):
        combobox_index = self.combobox.currentIndex()

        self.static_ax1.clear()
        self.static_ax2.clear()

        #updating the values
        x_test = self.initial_curve_x_value[combobox_index]
        y_test = self.initial_curve_y_value[combobox_index]
        x2_test = self.fit_curve_x_value_list[combobox_index]
        y2_test = self.fit_curve_y_value_list[combobox_index]
        error_y = self.fit_curve_error_value_list[combobox_index]
        zero_y = self.fit_curve_zero_list[combobox_index]

        #updating the charts
        self.static_ax1.plot(x_test, y_test)
        self.static_ax1.plot(x2_test, y2_test)

        self.static_ax2.plot(x2_test, error_y)
        self.static_ax2.plot(x2_test, zero_y)

x1_1 = [i for i in range(10)]
x1_1 = np.array(x1_1)
x1_2 = [i for i in range(10, 20,1)]
x1_2 = np.array(x1_2)


y1_1 = [i for i in range(10, 20,1)]
y1_1 = np.array(y1_1)
y1_2 = [i for i in range(20, 30,1)]
y1_2 = np.array(y1_2)
y1_3 = [i for i in range(30, 40,1)]
y1_3 = np.array(y1_3)
y1_4 = [i for i in range(40, 50,1)]
y1_4 = np.array(y1_4)
y1_5 = [i for i in range(20, 30,1)]
y1_5 = np.array(y1_5)
y1_6 = [i for i in range(30, 40,1)]
y1_6 = np.array(y1_6)

initial_curve_x_value = []
initial_curve_x_value.append(x1_1)
initial_curve_x_value.append(x1_2)

initial_curve_y_value = []
initial_curve_y_value.append(y1_1)
initial_curve_y_value.append(y1_2)

fit_curve_x_value_list = []
fit_curve_x_value_list.append(x1_1)
fit_curve_x_value_list.append(x1_2)

fit_curve_y_value_list = []
fit_curve_y_value_list.append(y1_3)
fit_curve_y_value_list.append(y1_4)

fit_curve_error_value_list = []
fit_curve_error_value_list.append(y1_5)
fit_curve_error_value_list.append(y1_6)

fit_curve_zero_list = []
zero = np.zeros(10)
fit_curve_zero_list.append(zero)
fit_curve_zero_list.append(zero)

fit_parameter_list = [[1, 2, 4], [2,3]]
fit_square_R_list = [0.99, 0.98]

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    mw = MainWindow(initial_curve_x_value, initial_curve_y_value,
                    fit_curve_x_value_list, fit_curve_y_value_list,
                    fit_curve_error_value_list, fit_curve_zero_list,
                    fit_parameter_list, fit_square_R_list
                    )
    mw.show()
    sys.exit(app.exec_())

Mainwindow.py

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QLabel, QComboBox
from PyQt5.QtCore import QRect

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        length_window = 1200
        height_window = 1200
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(length_window, height_window)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.combobox = QComboBox(MainWindow)
        self.combobox.setGeometry(QRect(900, 80, 250, 40))

        self.chart1 = QtWidgets.QWidget(MainWindow)
        self.chart1.setGeometry(QRect(50, 50, 800, 400))
        self.layout_chart1 = QtWidgets.QVBoxLayout(self.chart1)
        self.static_canvas1 = FigureCanvasQTAgg(Figure(figsize=(8,4)))
        self.layout_chart1.addWidget(self.static_canvas1)

        self.chart2 = QtWidgets.QWidget(MainWindow)
        self.chart2.setGeometry(QRect(50, 450, 800, 400))
        self.layout_chart2 = QtWidgets.QVBoxLayout(self.chart2)
        self.static_canvas2 = FigureCanvasQTAgg(Figure(figsize=(8,4)))
        self.layout_chart2.addWidget(self.static_canvas2)

        self.static_ax1 = self.static_canvas1.figure.subplots()
        self.static_ax2 = self.static_canvas2.figure.subplots()

1
wNakano 26 Июл 2020 в 19:51

1 ответ

Лучший ответ

Вы должны использовать метод холста draw(), чтобы обновить картину:

def changePlot(self):
    # ...

    self.static_ax2.plot(x2_test, error_y)
    self.static_ax2.plot(x2_test, zero_y)

    self.static_canvas1.draw()
    self.static_canvas2.draw()
0
eyllanesc 26 Июл 2020 в 19:05