'Need to clear Figure created in PyQt GUI

I used PyQt in my GUI for some plots but when I plot multiple graphs consecutively the figure doesn't completely clear and some of the axis and lines overlap each other. I've used the clear() and cla() functions but I'm probably not using it right.

I would like to be able to clear the entire figure including the axes and all previous plots so it doesn't mess with future plots.

Minimum Reproductible Sample

mplwidget.py

from PyQt5.QtWidgets import*

from matplotlib.backends.backend_qt5agg import FigureCanvas

from matplotlib.figure import Figure



class MplWidget(QWidget):
    
    def __init__(self, parent = None):

        QWidget.__init__(self, parent)
        
        self.canvas = FigureCanvas(Figure())
        
        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.canvas)
        
        self.canvas.axes = self.canvas.figure.add_subplot(111)
        self.setLayout(vertical_layout)

layout.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setObjectName("widget")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.widget)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.MplWidget = MplWidget(self.widget)
        self.MplWidget.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.MplWidget.setObjectName("MplWidget")
        self.gridLayout_2.addWidget(self.MplWidget, 0, 0, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.widget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout_2.addWidget(self.pushButton_2, 2, 0, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(self.widget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout_2.addWidget(self.pushButton_3, 3, 0, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout_2.addWidget(self.pushButton, 1, 0, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.widget)
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout_2.addWidget(self.pushButton_4, 4, 0, 1, 1)
        self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        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)
        
       
        self.pushButton.clicked.connect(self.plot)


        self.pushButton_2.clicked.connect(self.clear_plot)
        

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_2.setText(_translate("MainWindow", "Clear Plot"))
        self.pushButton_3.setText(_translate("MainWindow", "PushButton"))
        self.pushButton.setText(_translate("MainWindow", "Plot"))
        self.pushButton_4.setText(_translate("MainWindow", "PushButton"))
    
        
    global subplot_var_24
    
    subplot_var_24 = 0
    
    global counter
    
    counter = 0
    
    
    
    # cycle to different data to plot
    
    def create_values(self):
        
        global counter
        
        
        if counter == 0:
        
            self.a = ['a','b','c','d','e','f','g','h','i','j']
            
            self.b =[828, 1178, 891, 1010, 988, 842, 717, 767, 733, 1176]
            
            self.c = [871, 828, 1011, 997, 774, 1064, 757, 896, 1104, 1196]
            
            self.d = [99, 1, 47, 28, 71, 24, 55, 86, 15, 97]
            
            self.e = [520, 677, 537, 532, 795, 685, 530, 720, 569, 612]
            
            
            
        elif counter == 1:
            
            
            self.a = ['g','h','i','j','k','l','m','n','o','p']
            
            self.b = [1087, 803, 909, 961, 799, 764, 1044, 1069, 857, 737]
            
            self.c = [787, 908, 1086, 771, 712, 701, 977, 815, 772, 717]
            
            self.d = [8, 18, 74, 53, 50, 11, 65, 78, 88, 87]
            
            self.e = [621, 724, 744, 750, 663, 566, 553, 726, 537, 721]
        
            
        
            
        if counter == 0:
            
            counter = 1
            
        elif counter ==1:
            
            counter = 0
            
            
        
        
    
    # function to create plot 
    
    
    def plot(self):
        
        self.create_values()
        
        self.MplWidget.canvas.axes.clear()
                
        self.MplWidget.canvas.axes.cla()
        
        global subplot_var_24
                
        if subplot_var_24 == 1:
            
            self.ax3.cla()
            
            self.ax2.cla()
            
            
        self.lns1 = self.MplWidget.canvas.axes.stackplot(self.a, self.c, self.b, labels=['C', 'B'],colors = ["r", "skyblue"],  alpha=0.8)
                    
        
        self.MplWidget.canvas.axes.tick_params(axis='x', rotation=90, labelsize  = 18)
        
        self.MplWidget.canvas.axes.tick_params(axis='y', labelsize  = 18)
        
        self.ax3 = self.MplWidget.canvas.axes.twinx()
        
        self.ax3.cla()
        
        self.lns2 = self.ax3.plot(self.a, self.e, label = ["E"],lw = 2.5, color = "g")
        
        self.ax3.tick_params(axis='y', labelcolor = 'g', labelsize  = 18)
        
        
        self.ax2 = self.MplWidget.canvas.axes.twinx()
        
        
        self.ax2.cla()
        

        self.lns3 = self.ax2.plot(self.a, self.d, label = ["D"], lw = 2.5, color = "b")

        self.ax2.tick_params(axis='y', labelcolor = 'b', labelsize  = 18)

        self.ax2.set_ylim(0, 100)
        
        
        self.MplWidget.canvas.axes.set_xlabel('X', fontsize=18)
        self.MplWidget.canvas.axes.set_ylabel('B AND C', color='r', fontsize=18)
        self.ax2.set_ylabel('D', color='b', fontsize=18)
        self.ax3.set_ylabel('E', color='g', fontsize=18)
        
        self.ax3.spines["right"].set_position(("axes", 1.13))
        
        
        self.MplWidget.canvas.axes.set_title(('Graph'), fontsize=20)                                                  
                                                                                              
        
        self.MplWidget.canvas.figure.tight_layout()
        
        self.MplWidget.canvas.draw()
        
        self.MplWidget.canvas.show()
        
        
        subplot_var_24 = 1
        
        
        
    # function to clear the plot
    
    
    def clear_plot(self):
        
        self.MplWidget.canvas.axes.clear()
        
        self.MplWidget.canvas.axes.cla()
        
       #self.MplWidget.canvas.clear()
        
       #self.MplWidget.canvas.axes.draw()
       
        self.MplWidget.canvas.draw()
                
        
        
        
        
        

from mplwidget import MplWidget

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source