Вопрос или проблема
Я пытаюсь нарисовать 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())
Пояснения к коду:
-
Импорт необходимых библиотек: Мы импортируем модули
numpy
,matplotlib
, и интерфейсные библиотекиPySide6
. -
Класс
MplCanvas
: Это наследник классаFigureCanvasQTAgg
, который создает холст для рисования графиков Matplotlib. -
Класс
MainWindow
: Главный класс приложения, который управляет интерфейсом пользователя. Здесь мы создаем центральный виджет и добавляем в него наш холст. -
Метод
plot_contour
: Он отвечает за очистку осей, создание контурной диаграммы и привязку цветовой шкалы. Убедитесь, что вы используете один и тот же вызов методаcolorbar
для цветовой шкалы, чтобы избежать дублирования. - Запуск приложения: В конце кода запускается основной цикл приложения.
Заключение:
Если вы столкнулись с проблемой дублирующейся цветовой шкалы, убедитесь, что вы очищаете оси перед каждым новым рисованием и создаете только одну цветовую шкалу на каждый вызов функции отображения. Этот код должен корректно отображать вашу контурную диаграмму и цветовую шкалу без дублирования.