-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Why doesn't matplotlib save the whole figure by default? #17118
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Matplot does save "the whole figure". The concept is, like in a lot of other software, to define a figure like an empty sheet of fixed size. If elements that are later added overflow the borders of the sheet, it they will be cropped. For the common case of elements overflowing, matplotlib provides 4 ways to handle those:
Notes:
|
|
Thanks for your replies. They help a lot! |
savefig
saves cropped images by default.Bug summary
It's probably an issue that almost everybody who uses matplotlib would have encountered. If you generate a figure - which often contains axis labels and legends - and save it with default settings, you'll get a cropped image.
It's a duplicate of my question on stackoverflow.
Code for reproduction
Actual outcome
Expected outcome
If I generate the same plot in a jupyter notebook, without using
tight_layout
option, I see that all the elements of the plot are contained within the figure boundaries (shown in red).This figure is generated in the output cell of a jupyter notebook(!).
Then why it is not saved as it is? Why the saved image is by default different from the image jupyter notebook?
In my opinion this is a very fundamental issue with matplotlib.
Would't it make the lives of the users easier, if by default, all the elements are contained in the saved figure without the need of any workarounds?
(Thanks to stackoverflow), we know few workarounds but each has a caveat of its own..
Workaround #1: from within matplotlib: use of
tight_layout
option.It works for simple figures.
However, in my experience, it is not reliable option in the case of more complex, multi-panel figures.
tight_layout
often fails with errors such as these:Workaround #2: from outside of matplotlib: save the image in SVG format and then convert to png. For example using
--export-area-drawing
option in the inkscape command line UI or "resize to page" option in the inkscape's GUI.However, in this case you have to depend on external softwares which are difficult to add as dependencies in python packages (currently conda only hosts Windows version of inkscape).
So my question is..
Why doesn't matplotlib save the whole figure by default?
Matplotlib version
print(matplotlib.get_backend())
):The text was updated successfully, but these errors were encountered: