如何在图形中使用matplotlib紧凑布局?

90

我发现pyplot中有一个tight_layout函数,想要使用它。在我的应用程序中,我将matplotlib图表嵌入到Qt GUI中,并使用figure而不是pyplot。是否有任何方法可以在那里应用tight_layout?如果我在一个figure中有多个轴,它是否也有效?


重复的问题比较旧,而且在两个地方都有同一个人给出了相同的被接受的答案。 - Trenton McKinney
1个回答

140

只需像平常一样调用fig.tight_layout()即可。(pyplot仅是一个方便的包装器。在大多数情况下,您只需使用它快速生成图形和轴对象,然后直接调用它们的方法即可。)

QtAgg后端与默认后端之间不应有任何区别(如果有,那就是一个bug)。

例如:

import matplotlib.pyplot as plt

#-- In your case, you'd do something more like:
# from matplotlib.figure import Figure
# fig = Figure()
#-- ...but we want to use it interactive for a quick example, so 
#--    we'll do it this way
fig, axes = plt.subplots(nrows=4, ncols=4)

for i, ax in enumerate(axes.flat, start=1):
    ax.set_title('Test Axes {}'.format(i))
    ax.set_xlabel('X axis')
    ax.set_ylabel('Y axis')

plt.show()

紧凑布局之前

在此输入图片描述

紧凑布局之后

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4)

for i, ax in enumerate(axes.flat, start=1):
    ax.set_title('Test Axes {}'.format(i))
    ax.set_xlabel('X axis')
    ax.set_ylabel('Y axis')

fig.tight_layout()

plt.show()

这里输入图片描述


1
我已经尝试过这个,但是当我尝试将其与设置为pyplot.figure() ax对象的mpl_toolkits.basemap一起使用时,出现了ValueError: max() arg is an empty sequence。这是一个错误还是使用这个和basemap一起存在的限制? - ryanjdillon
4
@shootingstars - 这可能是因为你正在创建一个不是子图的轴。tight_layout 只是计算 subplots_adjust 的参数,所以它只适用于子图。请改用 fig, ax = plt.subplots()ax = fig.add_subplot(1,1,1) 来代替手动指定轴的范围,这样应该就能正常工作。(顺便说一句,新版本的 matplotlib 在这种情况下会给出更具信息性的错误提示。) - Joe Kington
太好了,谢谢Joe。我刚刚更新了我的matplotlibbasemap,因为我遇到了各种问题,这只是另一个更新的原因。 - ryanjdillon
1
你的fig = Figure()建议会导致tight_layout引发ValueError,除非以其他方式实例化轴。subplots是创建轴和图形实例的正确方法。 - hobs
我发现如果在代码中使用 plt.savefig(path_to_pdf) 保存图像为PDF时,plt.tight_layout() 的格式并没有真正转换为PDF格式。有什么解决方法吗? - user487588
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接