Как очистить правую ось, созданную через twinx() в GUI
У меня есть вспомогательный класс в файле gui.py:
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
class MplCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
self.fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = self.fig.add_subplot(111)
super(MplCanvas, self).__init__(self.fig)
Так же у меня есть класс главного окна в gui.py: class MainWidget(QWidget)
В котором есть три объекта вышеуказанного класса MplCanvas
: self.image1
, self.image2
, self.image3
В этих трёх объектах рисуются картинки через одну и ту же функцию: visual.draw_image
, которая находится в файле visual.py. В этой функции помимо основной оси ax
создается еще одна ось dax = ax.twinx()
.
Картинки обновляются функцией update_images
, вызываемой при нажатии на кнопку.
Каждый раз когда мне требовалось обновить картинку, я пробовал три способа очистки моих осей / фигуры / объекта MplCanvas() и т.д.:
1.
self.image1.axes.clear()
self.image2.axes.clear()
self.image3.axes.clear()
for ax in self.image1.axes.get_shared_x_axes().get_siblings(self.image1.axes):
ax.clear()
for ax in self.image2.axes.get_shared_x_axes().get_siblings(self.image2.axes):
ax.clear()
for as in self.image3.axes.get_shared_x_axes().get_siblings(self.image3.axes):
ax.clear()
self.image1.fig.canvas.draw()
self.image2.fig.canvas.draw()
self.image3.fig.canvas.draw()
Так вот, в первом случае правая ось dax
отображается два раза с двух картинок, во втором случае правая ось dax
с первой картинки очищается, но при этом отрисовывается новая - полностью новая без каких-либо лимитом, в третьем случае всё полностью удаляется и просто белый фон.
Как мне решить эту проблему? Помогите, люди добрые)
На коленке набросал код с моей проблемой:
gui.py:
import sys
from PyQt6.QtWidgets import QApplication, QVBoxLayout, QWidget
from PyQt6.QtWidgets import QGridLayout, QPushButton, QTabWidget
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import visual
class MplCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
self.fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = self.fig.add_subplot(111)
super(MplCanvas, self).__init__(self.fig)
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setWindowTitle("3 images")
self.setGeometry(0, 0, 1920, 1080)
# Main page layout
main_layout = QGridLayout()
self.setLayout(main_layout)
# Create tab widget
self.tab = QTabWidget(self)
"""
DISPLAY PAGE
"""
# Create DISPLAY page
display_page = QWidget(self)
display_page_layout = QVBoxLayout()
display_page.setLayout(display_page_layout)
"""
Graphical part
"""
# Graphical part of DISPLAY page
self.graph_part_layout = QGridLayout()
self.image1 = MplCanvas(self)
self.image2 = MplCanvas(self)
self.image3 = MplCanvas(self)
self.graph_part_layout.addWidget(self.image1, 1, 0)
self.graph_part_layout.addWidget(self.image2, 1, 1)
self.graph_part_layout.addWidget(self.image3, 1, 2)
"""
Formular part
"""
# Formular and play/pause buttons for animation
self.formular_layout = QGridLayout()
self.update_button = QPushButton("Update images")
self.update_button.clicked.connect(self.update_button_clicked)
# Adding everything to formular layout
self.formular_layout.addWidget(self.update_button, 0, 0)
"""
Adding everything to functional part
"""
display_page_layout.addLayout(self.formular_layout)
display_page_layout.setStretchFactor(self.formular_layout, 1)
"""
Adding everything to DISPLAY PAGE
"""
display_page_layout.addLayout(self.graph_part_layout)
display_page_layout.setStretchFactor(self.graph_part_layout, 3)
"""
Adding everything to MAIN LAYOUT
"""
self.tab.addTab(display_page, "Display")
main_layout.addWidget(self.tab, 0, 0, 1, 1)
self.show()
def update_button_clicked(self):
self.image1.axes.clear()
self.image2.axes.clear()
self.image3.axes.clear()
visual.draw_image(self.image1.axes)
visual.draw_image(self.image2.axes)
visual.draw_image(self.image3.axes)
def launch():
app = QApplication(sys.argv)
mainWindow = MainWindow()
# window.installEventFilter(window)
sys.exit(app.exec())
if __name__ == '__main__':
launch()
visual.py:
import numpy as np
def draw_image(ax):
my_image = np.random.randint(0, 255, (32, 32))
ax.set(xlim=(0, 32),
ylim=(0, np.random.randint(0, 32)))
hax = ax.twinx()
hax.set_ylim(ax.get_ylim())
ax.imshow(my_image, cmap="Greens")