Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Text or legend cut from matplotlib figure on savefig()

Tags:

matplotlib

Say I want to plot a very simple figure with 2-subplot laid out horizontally, and I want to add some text on the right of the second subplot. I am working in Jupyter Notebook, but this shouldn't change anything:

import matplotlib.pyplot as plt
%matplotlib inline

plt.figure(figsize=(8, 3))

ax1 = plt.subplot(121)
ax1.plot(x,y1)

ax2 = plt.subplot(122)
ax2.plot(x,y2)
ax2.text(1.05,0.7, 'Some text here', horizontalalignment='left', transform=ax2.transAxes)

The displayed output is just as I want it: Display, which is what I want

However, when I try to export the figure, the text to the right get cut:

plt.savefig(r'C:\mypy\test_graph.png', ext='png');

Not what I want, but what gets saved

Using plt.tightlayout(), as suggested here makes the problem worse.

How can I best resolve this?

like image 806
MPa Avatar asked Jun 20 '17 00:06

MPa


2 Answers

Jupyter notebook is by default configured to use its "inline" backend (%matplotlib inline). It displays a saved png version of the figure. During this saving, the option bbox_inches="tight" is used.

In order to replicate the figure that you see in the jupyter output, you would need to use this option as well.

plt.savefig("output.png", bbox_inches="tight")

What this command does is to extend or shrink the area of the saved figure to include all the artists in it.

Alternatively, you can shrink the content of the figure, such that there is enough space for the text to fit into the original figure.

This can be done with e.g.

plt.subplots_adjust(right=0.7)

which would mean that the rightmost axes stops at 70% of the figure width.

enter image description here

like image 54
ImportanceOfBeingErnest Avatar answered Nov 18 '22 21:11

ImportanceOfBeingErnest


Adding bbox_inches="tight" to the savefig **kwargs will do it:

plt.savefig(r'C:\mypy\test_graph.png', ext='png', bbox_inches="tight")  

Saved file: enter image description here

like image 8
MPa Avatar answered Nov 18 '22 23:11

MPa