The Question :
351 people think this question is useful
I am plotting a dataset using matplotlib
where I have an xlabel that is quite “tall” (it’s a formula rendered in TeX that contains a fraction and is therefore has the height equivalent of a couple of lines of text).
In any case, the bottom of the formula is always cut off when I draw the figures. Changing figure size doesn’t seem to help this, and I haven’t been able to figure out how to shift the x-axis “up” to make room for the xlabel. Something like that would be a reasonable temporary solution, but what would be nice would be to have a way to make matplotlib recognize automatically that the label is cut off and resize accordingly.
Here’s an example of what I mean:
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()
while you can see the entire ylabel, the xlabel is cut off at the bottom.
In the case this is a machine-specific problem, I am running this on OSX 10.6.8 with matplotlib 1.0.0
The Question Comments :
The Answer 1
530 people think this answer is useful
Use:
import matplotlib.pyplot as plt
plt.gcf().subplots_adjust(bottom=0.15)
to make room for the label.
Edit:
Since i gave the answer, matplotlib
has added the tight_layout()
function.
So i suggest to use it:
plt.tight_layout()
should make room for the xlabel.
The Answer 2
168 people think this answer is useful
An easy option is to configure matplotlib to automatically adjust the plot size. It works perfectly for me and I’m not sure why it’s not activated by default.
Method 1
Set this in your matplotlibrc file
figure.autolayout : True
See here for more information on customizing the matplotlibrc file: http://matplotlib.org/users/customizing.html
Method 2
Update the rcParams during runtime like this
from matplotlib import rcParams
rcParams.update({'figure.autolayout': True})
The advantage of using this approach is that your code will produce the same graphs on differently-configured machines.
The Answer 3
149 people think this answer is useful
In case you want to store it to a file, you solve it using bbox_inches="tight"
argument:
plt.savefig('myfile.png', bbox_inches = "tight")
The Answer 4
9 people think this answer is useful
plt.autoscale()
worked for me.
The Answer 5
7 people think this answer is useful
Putting plot.tight_layout()
after all changes on the graph, just before show()
or savefig()
will solve the problem.
The Answer 6
5 people think this answer is useful
You can also set custom padding as defaults in your $HOME/.matplotlib/matplotlib_rc
as follows. In the example below I have modified both the bottom and left out-of-the-box padding:
# 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
...
The Answer 7
0 people think this answer is useful
for some reason sharex was set to True so I turned it back to False and it worked fine.
df.plot(........,sharex=False)