'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 |
|---|
