Дублированная цветовая шкала с Matplotlib Contourf внутри виджета PySide6

Вопрос или проблема

Я пытаюсь нарисовать Contourf внутри виджета PySide6 с помощью следующего кода.

Канва Matplotlib создается с помощью этого класса:

class MplCanvas(FigureCanvasQTAgg):

    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)

Канва подключается к Qt виджету с помощью следующего кода:

self.canvas_meas_contour = MplCanvas(self, width=5, height=4, dpi=winconsts.PLOT_2D_DPI)
self.canvas_meas_contour.axes.tick_params(labelsize = winconsts.GRAPH_CONTOUR_TICKS_FONTSIZE)
vbl_contour = QVBoxLayout()
vbl_contour.addWidget(self.canvas_meas_contour)
self.ui.widget_meas_contour.setLayout(vbl_contour)

А Contourf рисуется с помощью следующего кода:

self.canvas_meas_contour.axes.cla()
self.canvas_meas_contour.axes.set_title('Контур')
self.canvas_meas_contour.axes.title.set_size(winconsts.GRAPH_CONTOUR_FONTSIZE)
cs = self.canvas_meas_contour.axes.contourf(X, Y, Z, levels = Z_levels, cmap = colormaps.colormap_sunset())
cbar = self.canvas_meas_contour.fig.colorbar(cs, ax=self.canvas_meas_contour.axes)
cbar.ax.tick_params(labelsize = winconsts.GRAPH_CONTOUR_TICKS_FONTSIZE)
self.canvas_meas_contour.draw()

Вот результат:

введите описание изображения здесь

При рисовании Contourf с теми же данными и цветовой схемой в отдельном Matplotlib, результатом является одна цветовая шкала, как и ожидалось.

Если я добавлю вторую цветовую шкалу перед вызовом draw(), эта последняя шкала будет одной, а не двойной.

Ответ или решение

Ваша задача — создать график с использованием contourf в виджете PySide6 с Matplotlib, при этом у вас возникает проблема с дублированием цветовой шкалы (colorbar). Для решения этой проблемы важно проверить несколько аспектов. Я приведу вам полный код с комментариями, который поможет вам понять, как правильно интегрировать контуры и цветовую шкалу в ваш виджет.

Вот исправленный код:

import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget

# Определяем класс для холста Matplotlib
class MplCanvas(FigureCanvasQTAgg):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        self.fig = plt.Figure(figsize=(width, height), dpi=dpi)
        self.axes = self.fig.add_subplot(111)
        super(MplCanvas, self).__init__(self.fig)

# Главный класс окна приложения
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Contourf Example with Colorbar')

        # Создаем центральный виджет
        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)

        # Создаем и настраиваем макет
        self.vbl_contour = QVBoxLayout(self.central_widget)

        # Инициализируем холст Matplotlib
        self.canvas_meas_contour = MplCanvas(self.central_widget, width=5, height=4, dpi=100)
        self.vbl_contour.addWidget(self.canvas_meas_contour)

        # Генерация данных для contourf
        X, Y = np.meshgrid(np.linspace(-3.0, 3.0, 100), np.linspace(-3.0, 3.0, 100))
        Z = np.sin(np.sqrt(X**2 + Y**2))

        # Отображение contourf и цветовой шкалы
        self.plot_contour(X, Y, Z)

    def plot_contour(self, X, Y, Z):
        # Очищаем оси
        self.canvas_meas_contour.axes.cla()

        # Устанавливаем заголовок и его параметры
        self.canvas_meas_contour.axes.set_title('Contour')
        self.canvas_meas_contour.axes.title.set_size(12)  # Установка размера шрифта титула

        # Создаем контурную заполненную диаграмму
        cs = self.canvas_meas_contour.axes.contourf(X, Y, Z, levels=20, cmap='plasma')

        # Создаем цветовую шкалу
        cbar = self.canvas_meas_contour.fig.colorbar(cs, ax=self.canvas_meas_contour.axes)
        cbar.ax.tick_params(labelsize=10)  # Устанавливаем размер шрифта для делений цветовой шкалы

        # Обновляем холст
        self.canvas_meas_contour.draw()

# Запускаем приложение
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(800, 600)
    window.show()
    sys.exit(app.exec())

Пояснения к коду:

  1. Импорт необходимых библиотек: Мы импортируем модули numpy, matplotlib, и интерфейсные библиотеки PySide6.

  2. Класс MplCanvas: Это наследник класса FigureCanvasQTAgg, который создает холст для рисования графиков Matplotlib.

  3. Класс MainWindow: Главный класс приложения, который управляет интерфейсом пользователя. Здесь мы создаем центральный виджет и добавляем в него наш холст.

  4. Метод plot_contour: Он отвечает за очистку осей, создание контурной диаграммы и привязку цветовой шкалы. Убедитесь, что вы используете один и тот же вызов метода colorbar для цветовой шкалы, чтобы избежать дублирования.

  5. Запуск приложения: В конце кода запускается основной цикл приложения.

Заключение:

Если вы столкнулись с проблемой дублирующейся цветовой шкалы, убедитесь, что вы очищаете оси перед каждым новым рисованием и создаете только одну цветовую шкалу на каждый вызов функции отображения. Этот код должен корректно отображать вашу контурную диаграмму и цветовую шкалу без дублирования.

Оцените материал
Добавить комментарий

Капча загружается...