Как построить ДВА графика внутри одного 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


