Python 如何使图形填充所有窗口

Python 如何使图形填充所有窗口,python,matplotlib,widget,qt-designer,Python,Matplotlib,Widget,Qt Designer,我在用QtDesigner创建的应用程序中绘制一个图形,问题是,当显示图形时,图形空间和mplwidget空间之间会出现一条大的“灰色边缘”。这会使绘图变小,那么如何删除在主窗口中显示图形时出现的这个大“灰色边框” 我想让我的图表填满小部件的所有可用空间。简短的回答是:“使用fig.tight\u layout()” 不过,让我再解释一下发生了什么 您将看到图形和轴之间的交互 图包含一个或多个轴(绘图/子绘图/etc)。所有内容都绘制在图形的画布上(基本上是后端特定的像素缓冲区或向量页面) 制

我在用QtDesigner创建的应用程序中绘制一个图形,问题是,当显示图形时,图形空间和mplwidget空间之间会出现一条大的“灰色边缘”。这会使绘图变小,那么如何删除在主窗口中显示图形时出现的这个大“灰色边框”

我想让我的图表填满小部件的所有可用空间。

简短的回答是:“使用
fig.tight\u layout()

不过,让我再解释一下发生了什么

您将看到图形和轴之间的交互

包含一个或多个
(绘图/子绘图/etc)。所有内容都绘制在图形的
画布上(基本上是后端特定的像素缓冲区或向量页面)


制作轴时,它不会填充整个图形

单轴的默认值是轴的左下角为图形宽度的12.5%和高度的10%,轴占图形宽度和高度的90%。(不对称是为左侧的刻度标签留出空间。)

您设置的位置是下图中白色框的范围。它不包括记号标签、标题、轴标签等(这就是为什么轴不能填满整个图形)

默认设置如下所示:

旁注:为了保持代码简短,我将使用
pyplot
界面自动生成一个
图形
、和
画布
,而您可能会显式地创建每个图形以与gui框架配合使用。但结果是一样的

每个轴实例占用的图形百分比在创建时设置。您可以显式指定它:

fig = plt.figure()
ax = fig.add_axes([left, bottom, width, height])
或者使用子地块的网格,通过
图可以更容易地进行调整。子地块\u调整

fig, axes = plt.subplots(nrows=2, ncols=2)
# Expand the grid of subplots out (Notice that 
fig.subplots_adjust(left=0.05, bottom=0.05, right=0.98, top=0.98)
tight\u layout
所做的是计算刻度标签、标题、轴标签等的范围,并确定
fig.subplots\u adjust
的参数,以便所有内容都刚好位于图形内部。(请记住
subplots\u adjust
和轴位置规范控制“白框”的范围)--实际轴本身--不包括刻度标签等)

因此,如果我们像以前那样做:

fig, ax = plt.subplots()
然后打电话:

fig.tight_layout()
我们将得到一些“边界”较少的东西,因为轴将占据图形的较大百分比:


如果您想控制“边框”的颜色,请使用
fig.set\u facecolor(color)
(或
fig.patch.set\u facecolor
)。

@newPyUser,如果您有一个嵌入的图形,如
self.ui.mplwidget
do

self.ui.mplwidget.canvas.fig.tight\u layout()

假设您的小部件定义如下:


使用一个嵌入式图形作为
self.ui.mplwidget
,一个非常简单的
self.ui.mplwidget.figure.tight_layout()
就可以完成这项工作,而无需定义画布。
如果图形上有其他功能,如轴标签或标题,请确保将
self.ui.mplwidget.figure.tight\u layout()
放在这些功能之后。

如何创建轴?它是一个
子图
实例?此外,您是否希望标签以及轴标签(如果有)在图形画布外显示或隐藏?因为您已经做了非常好的解释,您可能可以添加一些有关
紧密布局
参数的信息(框、垫、[hw]\pad)谢谢你的解释,这正是我想要的!!是时候测试它了,看看我能不能让它工作@Joe Kington,你的解释很好,但我仍然认为我做错了什么,因为我在尝试访问:self.mplwidget1.axes时没有得到任何好的结果。。。。或者self.mplwidget。。。。你能补充更多的信息吗??我将感激任何帮助!嵌入图也是这样吗?。我只有像self.ui.mplwidget这样的东西……
@newPyUser:self.ui.mplwidget.canvas.fig.tight_layout()怎么样?(详情请参阅我的答案)
from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
class MplCanvas(FigureCanvas):
    def __init__(self):
        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)
        FigureCanvas.__init__(self, self.fig)
        FigureCanvas.setSizePolicy(self,
                               QtGui.QSizePolicy.Expanding,
                               QtGui.QSizePolicy.Expanding)

        FigureCanvas.updateGeometry(self)

class MplWidget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.canvas = MplCanvas()
        self.vbl = QtGui.QVBoxLayout()
        self.vbl.addWidget(self.canvas)
        self.setLayout(self.vbl)