Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I save this matplotlib figure such that the x-axis labels are not cropped out?

I am running the following snippet of code in the ipython notebook, using the pandas data analysis library along with matplotlib.pyplot.

titles = {'gradStat_p3': "P3:  Gradiometers", 'magStat_p3': "P3:  Magnetometers",
          'gradStat_mmn': "MMN:  Gradiometers", 'magStat_mmn': "MMN:  Magnetometers"}

scales = {'gradStat': (-2.0 * 1e-22, 3.5 * 1e-22), 'magStat': (-1.6 * 1e-25, 4.5 * 1e-25)}

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 5))
fig.tight_layout()
for c, component in enumerate(('p3', 'mmn')):
    for s, sensor in enumerate(('gradStat', 'magStat')):
        key = sensor + '_' + component
        axes[c, s].set_ylim(scales[sensor])
        agg = aggregated[key]
        # Plot
        agg.plot(ax=axes[c, s], kind='bar', legend=False, title=titles[key])
        axes[c, s].set_xticklabels(agg.index.format(names=False))
        if not c:  # hide the labels
            axes[c, s].xaxis.set_visible(False)

        saveFile = '/tmp/ERF_comparative_barplot.pdf'
        fig.savefig(saveFile)

When the above code is executed, the following (correct) plot is produced in the ipython notebook's inline graphical output:

Correct format

Note that the x-lables are correctly displayed.

When the image is saved, however, the x-labels are cropped as such:

Erroneous format

I have tried calling fig.savefig(savefile, bbox_inches=0, but to no avail. How can I avoid this cropping?

NOTE: For your convenience, I have pickled the aggregated variable here. This is a dictionary of pandas DataFrame objects and it should be all you need to run the above code and reproduce the bug (assuming you have pandas v.0.8.1 installed).

Thanks very much in advance!

like image 298
Louis Thibault Avatar asked Sep 19 '12 08:09

Louis Thibault


1 Answers

You can use fig.tight_layout().

fig, ax = subplots(1,1,1)
ax.plot(np.random.randn(5))
ax.set_xticklabels(['this is a very long label', 'b', 'c', 'd', 'e'], rotation=90)
fig.tight_layout()
fig.savefig('test.pdf')
like image 59
Wouter Overmeire Avatar answered Sep 29 '22 16:09

Wouter Overmeire