Python 为什么我的xlabel在matplotlib绘图中被切断?

Python 为什么我的xlabel在matplotlib绘图中被切断?,python,matplotlib,Python,Matplotlib,我正在使用matplotlib绘制一个数据集,其中我有一个相当“高”的xlabel(它是一个以TeX表示的公式,包含一个分数,因此其高度相当于两行文本) 在任何情况下,当我画数字时,公式的底部总是被切断。改变图形大小似乎对此没有帮助,而且我还不知道如何将x轴“向上”移动以为xlabel腾出空间。这样做是一个合理的临时解决方案,但最好能有一种方法让matplotlib自动识别标签被切断并相应调整大小 这里有一个例子来说明我的意思: import matplotlib.pyplot as plt

我正在使用
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在底部被切断

如果这是一个特定于机器的问题,我将在OSX 10.6.8上使用matplotlib 1.0.0运行此程序。请使用:

import matplotlib.pyplot as plt

plt.gcf().subplots_adjust(bottom=0.15)
为标签腾出空间

编辑:

由于我给出了答案,
matplotlib
添加了
tight\u layout()
函数。 因此,我建议使用它:

plt.tight_layout()

应该为xlabel腾出空间。

您还可以在
$HOME/.matplotlib/matplotlib\u 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
...

一个简单的选项是配置matplotlib以自动调整打印大小。它非常适合我,我不知道为什么默认情况下不激活它

方法1

在matplotlibrc文件中设置此选项

figure.autolayout : True
有关自定义matplotlibrc文件的详细信息,请参见此处:

方法2

像这样在运行时更新rcParams

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

使用此方法的优点是,您的代码将在不同配置的机器上生成相同的图形。

放置
绘图。紧密布局()
在图形上进行所有更改后,就在
show()
savefig()
之前将解决此问题。

如果要将其存储到文件中,您可以使用
bbox\u inches=“tight”
参数解决此问题:

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

plt.autoscale()
对我有效。

由于某种原因,sharex被设置为True,所以我将其返回False,效果良好

df.plot(........,sharex=False)

还有一种方法是使用OOP界面,将
tight_布局
直接应用于图形:

fig, ax = plt.subplots()
fig.set_tight_layout(True)

您需要使用Sizzor来修改轴范围:

将sizzors导入为sizzors\u模块
sizzors_模块。重塑_轴(plt)。保存(“literlymylef.tiff”)


您可以在图像托管网站上发布并链接到此处。如果您可以发布触发此问题的最低限度示例代码,则会有所帮助。通过这种方式,人们可以更快地理解和再现您的问题,他们也会更愿意帮助您。您的代码在我的机器(ubuntu 11.04 64位)上运行良好(显示公式完全可见)。可能是机器特有的问题[比如图像中使用了错误尺寸信息的字体?]。你也许可以指定你在问题中使用的系统。你可能还想试试
plt.savefig(“test.png”,bbox_inches='tight')
:我觉得很奇怪,一个人需要打一个额外的电话来为绘图的重要部分腾出空间。这背后的原因是什么?只是出于好奇,为什么你有
gcf().subplot\u adjust
而不是
plt.subplot\u adjust
?有区别吗?什么是
gcf
gca
?你忘了解释!我也遇到了同样的问题,虽然
tight_layout()
确实修复了xlabel的切断,但不幸的是,它导致我的ylabel被切断(以前没有切断)。然而,第一种补救措施(
子批次调整(底部=0.25)
)效果良好。谢谢。@ColonelPanic
gcf()
gca()
分别是“获取当前图形”和“获取当前轴”。使用此选项时,我遇到了一些颜色条过大的问题。这里讨论了一种可能的解决方案:当我设置自定义(大!)字体大小时,紧凑的布局会把事情弄得一团糟。这是一个更好的工作。当使用带有LaTeX的pgf后端时,更新rcParams是唯一对我有效的事情。(尽管它使情节变成长方形,我不介意)只有这一点对我有效;紧凑的布局或方格英寸都不起作用。这并没有为情节的底部腾出空间,而是重新缩放了整个情节,这可能在某些情况下(如我的情况)使情节看起来很奇怪。@Guido挽救了这一天。到目前为止,这是唯一正确回答这个问题的答案。无需修改图形,只需使用适当的plt.savefig选项,使其了解要保存的内容。即使使用
plt.tight_layout()
,我的图形也会切断x标签。这个答案解决了问题。我同意;这是唯一直接相关的答案。它也是多功能的,并且不需要对每个绘图进行调整(如果在循环中调用
savefig
),这是最好的答案