I'd like to place 3 graphs made using seaborn, which has been passed from a different function in different python file via a dictionary, inside 3 different pyQT widgets I created in pyQT designer. I will post my code below and clarify further:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
glycerate_PT_Graphs = glycerate_PT.get_PT() #get dictionary of graphs
fig1 = glycerate_PT_Graphs['Level 1']
fig2 = glycerate_PT_Graphs['Level 2']
fig3 = glycerate_PT_Graphs['Level 3']
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1150, 771)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.Level1 = QtWidgets.QWidget(self.centralwidget) #How to make this object a graph/figure?
self.Level1.setGeometry(QtCore.QRect(520, 90, 241, 131))
self.Level1.setObjectName("Level1")
self.Level2 = QtWidgets.QWidget(self.centralwidget)
self.Level2.setGeometry(QtCore.QRect(520, 250, 241, 121))
self.Level2.setObjectName("Level2")
self.Level3 = QtWidgets.QWidget(self.centralwidget)
self.Level3.setGeometry(QtCore.QRect(520, 390, 241, 131))
self.Level3.setObjectName("Level3")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1150, 20))
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"))
Additionally, here is what is stored inside the dictionary.
def graph_PrecisionTotal(self, key, df):
sns.set_style('darkgrid')
fig, ax = plt.subplots()
ax = sns.boxplot(x='Date', y='Calculated Concentration', data=df, width=0.2, whis=10)
ax.set_title(str(self.analyte_name) + ' ' + key)
fig = ax.get_figure()
self.QCgraphs[key] = fig
I would simply like these 'self.Level1', 'self.Level2', and 'self.Level3' QtWidget objects to be seaborn graphs. How can I make that happen?
You should consider:
from PyQt5 import QtCore, QtGui, QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure
import seaborn as sns
from gui import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
sns.set_theme(style="darkgrid")
tips = sns.load_dataset("tips")
self.plot(self.ui.Level1, tips, "plot1")
self.plot(self.ui.Level2, tips, "plot2")
self.plot(self.ui.Level3, tips, "plot3")
def plot(self, widget, df, title):
canvas = FigureCanvas(Figure())
ax = canvas.figure.subplots()
sns.boxplot(ax=ax, x="day", y="total_bill", data=df, width=0.2, whis=10)
ax.set_title(title)
lay = QtWidgets.QVBoxLayout(widget)
lay.addWidget(canvas)
canvas.draw()
return canvas
if __name__ == "__main__":
app = QtWidgets.QApplication([])
w = MainWindow()
w.show()
app.exec_()