Виджет Matplotlib в Qt GUI отказывается выравнивать несколько осей - PullRequest
0 голосов
/ 21 мая 2018

Если я нарисую некоторые начальные заполнители в Matplotlib, чтобы не сделать мой графический интерфейс полностью пустым при запуске, он будет смещен, несмотря на добавление щедрой суммы tight_layout:

enter image description here

Однако, если я изменю размер окна всего на один пиксель ...: enter image description here

Это работает!Но никто не хочет говорить интерфейсу, чтобы он собрал себя перед началом работы ... Так есть ли способ решить эту проблему?Похоже, этого не происходит с самим сырым Matplotlib.

Минимальный код интерфейса:

from PyQt5.Qt import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np

class WidgetPlot(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setLayout(QVBoxLayout())
        self.canvas = PlotCanvas(self)
        self.layout().addWidget(self.canvas)

class PlotCanvas(FigureCanvas):
    def __init__(self, parent = None, width = 1, height = 1, dpi = 100):
        self.fig = Figure(figsize = (width, height), dpi = dpi, tight_layout = True)
        self.ax1 = self.fig.add_subplot(131)
        self.ax2 = self.fig.add_subplot(132)
        self.ax3 = self.fig.add_subplot(133)

        self.axes = self.ax1, self.ax2, self.ax3

        FigureCanvas.__init__(self, self.fig)

class Ui_TraceWindow(object):
    def setupUi(self, TraceWindow):
        TraceWindow.setObjectName("TraceWindow")
        TraceWindow.resize(1000, 500)
        self.centralWidget = QWidget(TraceWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.gridLayout_2 = QGridLayout(self.centralWidget)
        self.gridLayout = QGridLayout()
        self.mpl_LayoutBox = QVBoxLayout()
        self.gridLayout.addLayout(self.mpl_LayoutBox, 3, 1, 1, 1)
        self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 1)
        TraceWindow.setCentralWidget(self.centralWidget)

        # Instantiate canvas here
        self.m = WidgetPlot()
        self.canvas = self.m.canvas
        self.mpl_LayoutBox.addWidget(self.m)

        self.drawStuff()

    def drawStuff(self):
        a = np.ndarray(shape = (500, 500))

        for ax in self.canvas.axes:
            ax.clear()
            ax.imshow(a)

        self.canvas.fig.tight_layout()
        self.canvas.draw()
        self.canvas.fig.tight_layout()


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    TraceWindow = QMainWindow()
    ui = Ui_TraceWindow()
    ui.setupUi(TraceWindow)
    TraceWindow.show()
    sys.exit(app.exec_()) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...