Как очистить правую ось, созданную через 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")

Получается вот такая фигня: введите сюда описание изображения


Ответы (0 шт):