Python 在PyQt5中调整父窗口的大小时,如何更改matplotlib图形/轴的拉伸方式?

Python 在PyQt5中调整父窗口的大小时,如何更改matplotlib图形/轴的拉伸方式?,python,matplotlib,pyqt,pyqt5,Python,Matplotlib,Pyqt,Pyqt5,我有一个带有eMeded图形的程序,该程序还显示一个带有自定义刻度标签的颜色栏。但是,地物的自动调整大小会切断部分记号标签。如果我可以简单地手动调整窗口的大小,以便再次显示所有内容,这也不会太糟糕。但是,当您调整窗口大小时,图形的拉伸方式会导致在左侧创建一个较大的空白,而右侧的记号标签仍然无法完全看到,除非您将窗口拉伸到不必要的宽度。我怎样才能改变这种行为? 下面是一个例子。正如你所看到的,我已经尝试了一些方法,但没有一种有效 import numpy as np import sys impo

我有一个带有eMeded图形的程序,该程序还显示一个带有自定义刻度标签的颜色栏。但是,地物的自动调整大小会切断部分记号标签。如果我可以简单地手动调整窗口的大小,以便再次显示所有内容,这也不会太糟糕。但是,当您调整窗口大小时,图形的拉伸方式会导致在左侧创建一个较大的空白,而右侧的记号标签仍然无法完全看到,除非您将窗口拉伸到不必要的宽度。我怎样才能改变这种行为? 下面是一个例子。正如你所看到的,我已经尝试了一些方法,但没有一种有效

import numpy as np
import sys
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import \
    FigureCanvasQTAgg as FigureCanvas
import matplotlib.ticker as mticker


from PyQt5.QtWidgets import QApplication, QDialog, QGridLayout
from PyQt5.QtCore import QSize


class MathTextSciFormatter(mticker.Formatter):
    def __init__(self, fmt="%1.1e"):
        self.fmt = fmt

    def __call__(self, x, pos=None):
        s = self.fmt % x
        decimal_point = '.'
        positive_sign = '+'
        tup = s.split('e')
        significand = tup[0].rstrip(decimal_point)
        sign = tup[1][0].replace(positive_sign, '')
        exponent = tup[1][1:].lstrip('0')
        if exponent:
            exponent = '10^{%s%s}' % (sign, exponent)
        if significand and exponent:
            s = r'%s{\times}%s' % (significand, exponent)
        else:
            s = r'%s%s' % (significand, exponent)
        return "${}$ W/m${{}}^2$".format(s)


class Test(QDialog):
    def __init__(self):
        super().__init__()
        self.lay = QGridLayout(self)
        self.fig, self.ax = plt.subplots()
        # self.ax.set_anchor('SW')
        # self.ax.set_position([0, 0, 0, 0])
        # self.fig.tight_layout()
        # self.ax.margins(0, 0)
        self.canvas = FigureCanvas(self.fig)
        self.lay.addWidget(self.canvas)
        self.resize(QSize(380, 290))
        self.setMaximumHeight(290)
        self.image = np.reshape(np.random.randint(0, 1000, 10000), (100, 100))
        self.image_artist = self.ax.imshow(self.image)
        self.colorbar = self.fig.colorbar(self.image_artist)
        self.colorbar.ax.yaxis.set_major_formatter(
            MathTextSciFormatter()
        )


if __name__ == '__main__':
    app = QApplication(sys.argv)
    test = Test()
    test.show()
    sys.exit(app.exec_())

正如ImportanceOfBeingErnest在一篇评论中指出的那样,使用
constrained_布局
就可以做到这一点

import numpy as np
import sys
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import \
    FigureCanvasQTAgg as FigureCanvas
import matplotlib.ticker as mticker


from PyQt5.QtWidgets import QApplication, QDialog, QGridLayout
from PyQt5.QtCore import QSize


class MathTextSciFormatter(mticker.Formatter):
    def __init__(self, fmt="%1.1e"):
        self.fmt = fmt

    def __call__(self, x, pos=None):
        s = self.fmt % x
        decimal_point = '.'
        positive_sign = '+'
        tup = s.split('e')
        significand = tup[0].rstrip(decimal_point)
        sign = tup[1][0].replace(positive_sign, '')
        exponent = tup[1][1:].lstrip('0')
        if exponent:
            exponent = '10^{%s%s}' % (sign, exponent)
        if significand and exponent:
            s = r'%s{\times}%s' % (significand, exponent)
        else:
            s = r'%s%s' % (significand, exponent)
        return "${}$ W/m${{}}^2$".format(s)


class Test(QDialog):
    def __init__(self):
        super().__init__()
        self.lay = QGridLayout(self)
        self.fig, self.ax = plt.subplots(constrained_layout=True)
        # self.ax.set_anchor('SW')
        # self.ax.set_position([0, 0, 0, 0])
        # self.fig.tight_layout()
        # self.ax.margins(0, 0)
        self.canvas = FigureCanvas(self.fig)
        self.lay.addWidget(self.canvas)
        self.resize(QSize(380, 290))
        self.setMaximumHeight(290)
        self.image = np.reshape(np.random.randint(0, 1000, 10000), (100, 100))
        self.image_artist = self.ax.imshow(self.image)
        self.colorbar = self.fig.colorbar(self.image_artist)
        self.colorbar.ax.yaxis.set_major_formatter(
            MathTextSciFormatter()
        )


if __name__ == '__main__':
    app = QApplication(sys.argv)
    test = Test()
    test.show()
    sys.exit(app.exec_())

检查
constrated\u layout
谢谢,如果你想制定一个答案,我会接受的!然而,现在我有一个新问题。。。