Проблема между фигурой Matplotlib и виджетом PyQt5 / PySide2 QSplitter

#python #matplotlib #pyqt5 #pyside2

#python #matplotlib #pyqt5 #pyside2

Вопрос:

Я пытаюсь создать 2 фигуры графика, размер которых можно автоматически изменять с помощью виджета PyQt5 / PySide2 QSplitter. Однако, когда я сжимаю графики, их заголовок и метки оси x перекрываются, как показано ниже. Он выглядит сломанным. Кто-нибудь знает лучшие приемы для решения этой проблемы?

Вот мой пример кода

 import numpy as np
from PySide2 import QtWidgets, QtCore
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
import matplotlib
matplotlib.use('Qt5Agg')


class MyChart(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        canvas1 = FigureCanvasQTAgg(Figure(figsize=(20,12))) 
        ax1 = canvas1.figure.add_subplot(111)
        ax1.plot(np.sin(np.linspace(0, 4, 1000)))
        ax1.set_title('Chart 1')

        canvas2 = FigureCanvasQTAgg(Figure(figsize=(20,12))) 
        ax2 = canvas2.figure.add_subplot(111)
        ax2.plot(np.sin(5 * np.linspace(0, 4, 1000)))
        ax2.set_title('Chart 2')
        
        splitter = QtWidgets.QSplitter(QtCore.Qt.Vertical)
        splitter.addWidget(canvas1)
        splitter.addWidget(canvas2)
        self.setCentralWidget(splitter)
        self.show()

if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    w = MyChart()
    app.exec_()
  

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

Ответ №1:

Благодаря Джоди с форума matplotlib решение оказалось намного проще, чем я думал. Просто включите constrained_layout=True в конструктор figure и все!! Вот результат.

 ...
canvas1 = FigureCanvasQTAgg(Figure(figsize=(20,12), constrained_layout=True)) 
...
canvas2 = FigureCanvasQTAgg(Figure(figsize=(20,12), constrained_layout=True)) 
...
  

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