为什么在matplotlib图中我的xlabel被截断了?


302

我正在使用matplotlib具有“很高”的xlabel的位置绘制数据集(这是在TeX中渲染的公式,其中包含一个分数,因此其高度等于几行文本)。

无论如何,当我绘制数字时,公式的底部总是被切除。更改图形大小似乎无济于事,而且我还无法弄清楚如何将x轴“向上”移动以为xlabel腾出空间。诸如此类的东西是一个合理的临时解决方案,但最好的办法是使matplotlib自动识别标签已被剪切并相应地调整大小。

这是我的意思的示例:

import matplotlib.pyplot as plt

plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$')
plt.show()

虽然您可以看到整个ylabel,但xlabel在底部被切除了。

如果这是机器特定的问题,我将在带有matplotlib 1.0.0的OSX 10.6.8上运行此问题


4
您可以在图像托管网站上发布并在此处链接。
2011年

1
如果您可以发布触发此问题的简约示例代码,则将有帮助。这样,人们可以更快地理解和重现您的问题,他们将更有可能为您提供帮助。
DenilsonSáMaia的

您的代码在我的机器(ubuntu 11.04 64bit)上工作正常(显示完全可见的公式)。也许是机器特定的问题(例如图像中使用了带有错误尺寸信息的字体?)。您也许可以指定问题中使用的系统。
mac

9
你也可以试试plt.savefig("test.png",bbox_inches='tight')stackoverflow.com/questions/21288062/...
艺博阳

Answers:


473

采用:

import matplotlib.pyplot as plt

plt.gcf().subplots_adjust(bottom=0.15)

为标签腾出空间。

编辑:

自从我给出答案以来,matplotlib增加了tight_layout()功能。所以我建议使用它:

plt.tight_layout()

应该为xlabel腾出空间。


141
我觉得很奇怪,一个人需要打个电话,为情节的重要部分腾出空间。这背后的原因是什么?
不同的本

3
只是出于好奇,您为什么要拥有gcf().subplots_adjust而不是plt.subplots_adjust?有区别吗?
juniper- 2013年

49
什么是gcfgca?您忽略了解释!
Panic Panic 2014年

12
我遇到了同样的问题,虽然tight_layout()确实修复了xlabels的截止点,但不幸的是,它导致了我的ylabel被截止了(之前没有被截止)。但是,第一种补救措施(subplots_adjust(bottom=0.25))效果很好。谢谢。
Scott H

17
@ColonelPanic gcf()gca()分别是“获取当前图形”和“获取当前轴”。
DrMisha

150

一个简单的选项是将matplotlib配置为自动调整绘图大小。它非常适合我,我不确定为什么默认情况下未激活它。

方法一

在您的matplotlibrc文件中进行设置

figure.autolayout : True

有关自定义matplotlibrc文件的更多信息,请参见此处:http : //matplotlib.org/users/customizing.html

方法2

像这样在运行时更新rcParams

from matplotlib import rcParams
rcParams.update({'figure.autolayout': True})

使用这种方法的优点是您的代码将在配置不同的计算机上生成相同的图形。


使用此选项时,我对色条太大有一些问题。这里讨论了一种可能的解决方案:matplotlib.org/users/tight_layout_guide.html
PiQuer 2013年

2
当我设置自定义(大字体!)字体大小时,tight_layout使事情变得一团糟。这做得更好。
BenB

在pgf后端和LaTeX一起使用时,更新rcParams确实是唯一对我有用的方法。(即使它使图呈矩形,我也不介意)
h4nek

只有这个对我有用;没有tight_layout或box_inches起作用
zed111

106

如果要将其存储到文件中,可以使用bbox_inches="tight"参数来解决:

plt.savefig('myfile.png', bbox_inches = "tight")

2
@Guido保存了一天
pcko1

7

plot.tight_layout()所有更改放在图表上,show()savefig()将解决问题。


1
这不会为图的底部留出空间,而是会重新缩放整个图,这在某些情况下(例如我的情况)可能会使图看起来很奇怪。
89f3a1c


5

您还可以$HOME/.matplotlib/matplotlib_rc按照以下方式将自定义填充设置为默认值。在下面的示例中,我同时修改了底部和左侧的填充:

# The figure subplot parameters.  All dimensions are a fraction of the
# figure width or height
figure.subplot.left  : 0.1 #left side of the subplots of the figure
#figure.subplot.right : 0.9 
figure.subplot.bottom : 0.15
...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.