Как построить ДВА графика внутри одного QWidget?

Как можно построить ДВА графика, которые будут брать данные из .csv и строить графики по разным данным на осях (например a = x, b = y для первого графика и a = x, c = y для второго) и как добавить коэффициент Пирсона в title графика?

Либо же как можно построить два графика внутри одного QWidget с теми же условиями.

.csv

a,b,c
1740.0000,15.7100,17.2564
1740.2000,15.7100,17.2564
1740.4000,14.4500,14.6039
1740.6000,15.3800,16.5617
1740.8000,14.8400,15.4249
1741.0000,12.7700,11.0673
1741.2000,13.0500,11.6567
1741.4000,13.2800,12.1409
1741.6000,11.1000, 7.5517
1741.8000,11.7200, 8.8569

testtest.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(419, 338)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.open_file = QtWidgets.QPushButton(self.centralwidget)
        self.open_file.setObjectName("open_file")
        self.verticalLayout.addWidget(self.open_file)
        self.draw_graph = QtWidgets.QPushButton(self.centralwidget)
        self.draw_graph.setObjectName("draw_graph")
        self.verticalLayout.addWidget(self.draw_graph)
        self.horizontalLayout.addLayout(self.verticalLayout)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.item_list = QtWidgets.QListWidget(self.centralwidget)
        self.item_list.setObjectName("item_list")
        self.verticalLayout_2.addWidget(self.item_list)
        self.data_tab = QtWidgets.QTableWidget(self.centralwidget)
        self.data_tab.setObjectName("data_tab")
        self.data_tab.setColumnCount(0)
        self.data_tab.setRowCount(0)
        self.verticalLayout_2.addWidget(self.data_tab)
        self.horizontalLayout.addLayout(self.verticalLayout_2)
        self.wid_graph = QtWidgets.QWidget(self.centralwidget)
        self.wid_graph.setObjectName("wid_graph")
        self.horizontalLayout.addWidget(self.wid_graph)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 419, 22))
    self.menubar.setObjectName("menubar")
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)

    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    self.open_file.setText(_translate("MainWindow", "open"))
    self.draw_graph.setText(_translate("MainWindow", "draw"))`

main.py:

import os
import sys
from PyQt5 import QtWidgets
import pandas as pd
import numpy as np
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

import testtest

class MplCanvas(FigureCanvas):
    def __init__(self):
        self.fig = Figure()
        super(MplCanvas, self).__init__(self.fig)

    def plot(self, x, y):
        self.fig.clear()
        self.ax = self.fig.add_subplot(111)
        self.ax.plot(x, y, 'o', color='r')
        self.ax.grid(True)
        self.draw()

    def clear_plot(self):
        self.fig.clear()
        self.draw()


class Agk_1(QtWidgets.QMainWindow, testtest.Ui_MainWindow):
    def __init__(self):
        super(Agk_1, self).__init__()

        self.setupUi(self)
        self.open_file.clicked.connect(self.f_sel)
        self.item_list.itemClicked.connect(self.conv)
        self.draw_graph.clicked.connect(self.show_g)

        self.canavas = MplCanvas()
        self.canavas.setMinimumSize(180, 290)
        self.toolbar = NavigationToolbar(self.canavas, self)
        self.wid = QtWidgets.QGridLayout(self.wid_graph)
        self.wid.addWidget(self.canavas)
        self.wid.addWidget(self.toolbar)
        self.toolbar.hide()

    def f_sel(self):
        self.dir = QtWidgets.QFileDialog.getExistingDirectory(self.item_list, "Open csv")
        if self.dir:
            for root, dirs, files in os.walk(self.dir):
                for file_name in files:
                    if file_name.endswith(".csv"):
                        self.item_list.addItem(file_name)
        if not self.dir:
            return

    def conv(self, item):
        self.data_tab.clear()
        f_n = item.text()
        df = pd.read_csv(f_n)
        numColomn = 0
        if numColomn == 0:
            numRows = len(df.index)
        else:
            numRows = numColomn

        self.data_tab.setColumnCount(len(df.columns))
        self.data_tab.setRowCount(numRows)
        self.data_tab.setHorizontalHeaderLabels(df.columns)

        for i in range(numRows):
            for j in range(len(df.columns)):
                self.data_tab.setItem(i, j, QtWidgets.QTableWidgetItem(str(df.iat[i, j])))

        

self.data_tab.resizeColumnsToContents()
        self.data_tab.resizeRowsToContents()

    def show_g(self):
        rows = self.data_tab.rowCount()
        x = []
        y = []
        for row in range(rows):
            item_y = self.data_tab.item(row, 1)
            item_x = self.data_tab.item(row, 2)
            x.append(float(item_x.text().replace(',', '.')))
            y.append(float(item_y.text().replace(',', '.')))
            cor = np.corrcoef(x, y)
            print(cor)

        self.canavas.plot(x, y, )
        self.toolbar.show()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ui = Agk_1()
    ui.show()
    sys.exit(app.exec_())

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

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

Попробуйте так:

main.py

import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import pandas as pd
import numpy as np

from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

#from testtest import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(419, 338)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.open_file = QtWidgets.QPushButton(self.centralwidget)
        self.open_file.setObjectName("open_file")
        self.verticalLayout.addWidget(self.open_file)
        self.draw_graph = QtWidgets.QPushButton(self.centralwidget)
        self.draw_graph.setObjectName("draw_graph")
        self.verticalLayout.addWidget(self.draw_graph)
        self.horizontalLayout.addLayout(self.verticalLayout)
        
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.item_list = QtWidgets.QListWidget(self.centralwidget)
        self.item_list.setObjectName("item_list")
        self.verticalLayout_2.addWidget(self.item_list)
        self.data_tab = QtWidgets.QTableWidget(self.centralwidget)
        self.data_tab.setObjectName("data_tab")
        self.data_tab.setColumnCount(0)
        self.data_tab.setRowCount(0)
        self.verticalLayout_2.addWidget(self.data_tab)
        self.horizontalLayout.addLayout(self.verticalLayout_2)
        
        self.wid_graph = QtWidgets.QWidget(self.centralwidget)
        self.wid_graph.setObjectName("wid_graph")
        self.horizontalLayout.addWidget(self.wid_graph)
        
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 419, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.open_file.setText(_translate("MainWindow", "open"))
        self.draw_graph.setText(_translate("MainWindow", "draw"))
    
    
class MplCanvas(FigureCanvas):
    def __init__(self):
        self.fig = Figure()
        super(MplCanvas, self).__init__(self.fig)

    def plot(self, x, y, fl=True):                                           # +++ fl=True
        if fl:                                                               # +++
            self.fig.clear()
            self.ax = self.fig.add_subplot(111)
            self.ax.plot(x, y, 'o', color='r')
            self.ax.grid(True)
        else:                                                                # +++
            self.ax.plot(x, y, marker="o", color='b')                        # +++  
            self.draw()                                                      # ---->

    def clear_plot(self):
        self.fig.clear()
        self.draw()


class Agk_1(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(Agk_1, self).__init__()

        self.setupUi(self)
        
        self.dir = 'D:/_Qt/__Qt/testCSV'                                     # +++
        
        self.open_file.clicked.connect(self.f_sel)
        self.item_list.itemClicked.connect(self.conv)
        self.draw_graph.clicked.connect(self.show_g)

        self.canavas = MplCanvas()
        self.canavas.setMinimumSize(180, 290)
        self.toolbar = NavigationToolbar(self.canavas, self)
        self.wid = QtWidgets.QGridLayout(self.wid_graph)
        self.wid.addWidget(self.canavas)
        self.wid.addWidget(self.toolbar)
        self.toolbar.hide()

    def f_sel(self):
        self.dir = QtWidgets.QFileDialog.getExistingDirectory(
            self.item_list,  
            "Open Dir",                                                       # !!! Dir
            self.dir,                                                         # +++
            QtWidgets.QFileDialog.ShowDirsOnly |                              # +++
            QtWidgets.QFileDialog.DontResolveSymlinks                         # +++
        )
        if self.dir:
            for root, dirs, files in os.walk(self.dir):
                for file_name in files:
                    if file_name.endswith(".csv"):
                        self.item_list.addItem(file_name)

# ???        if not self.dir:
# ???            return

    def conv(self, item):
        if not self.dir:                                                      # +++
            return                                                            # +++
    
        self.data_tab.clear()
        
#        f_n = item.text()
        f_n = f'{self.dir}/{item.text()}'                                     # +++       
        #print(f'----- {f_n}') 
        
        df = pd.read_csv(f_n)
        numColomn = 0
        if numColomn == 0:
            numRows = len(df.index)
        else:
            numRows = numColomn

        self.data_tab.setColumnCount(len(df.columns))
        self.data_tab.setRowCount(numRows)
        self.data_tab.setHorizontalHeaderLabels(df.columns)

        for i in range(numRows):
            for j in range(len(df.columns)):
                self.data_tab.setItem(i, j, QtWidgets.QTableWidgetItem(str(df.iat[i, j])))

        self.data_tab.resizeColumnsToContents()
        self.data_tab.resizeRowsToContents()

    def show_g(self):
        rows = self.data_tab.rowCount()
        x = []
        y = []
        y_2 = []
        '''
#        for row in range(rows):
#            item_y = self.data_tab.item(row, 1)
#            item_x = self.data_tab.item(row, 2)
#            x.append(float(item_x.text().replace(',', '.')))
#            y.append(float(item_y.text().replace(',', '.')))
#            cor = np.corrcoef(x, y)
#            print(cor)
        '''
        for row in range(rows):
            item_x = self.data_tab.item(row, 0)                                # +++ row, 0
            item_y = self.data_tab.item(row, 1)                                # +++ row, 1
            
            item_y_2 = self.data_tab.item(row, 2)                              # !!! +++ row, 2
            
            x.append(float(item_x.text().replace(',', '.')))
            y.append(float(item_y.text().replace(',', '.')))
            y_2.append(float(item_y_2.text().replace(',', '.')))               # !!! +++
        
        self.canavas.plot(x, y, fl=True)
        self.canavas.plot(x, y_2, fl=False)                                    # !!! +++
        self.toolbar.show()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ui = Agk_1()
    ui.show()
    sys.exit(app.exec_())

q1404587.csv

a,b,c
1740.0000,1.7100,10.2564
1740.2000,2.7100,9.2564
1740.4000,3.4500,8.6039
1740.6000,4.3800,7.5617
1740.8000,5.8400,6.4249
1741.0000,6.7700,5.0673
1741.2000,7.0500,4.6567
1741.4000,8.2800,3.1409
1741.6000,9.1000, 2.5517
1741.8000,10.7200, 1.8569

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

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

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

→ Ссылка