Title: Why doesn't matplotlib save the whole figure by default? · Issue #17118 · matplotlib/matplotlib · GitHub
Open Graph Title: Why doesn't matplotlib save the whole figure by default? · Issue #17118 · matplotlib/matplotlib
X Title: Why doesn't matplotlib save the whole figure by default? · Issue #17118 · matplotlib/matplotlib
Description: 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 defa...
Open Graph Description: 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 la...
X Description: 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 axi...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/17118
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Why doesn't matplotlib save the whole figure by default?","articleBody":"\r\n### `savefig` saves cropped images by default.\r\n\r\n### **Bug summary**\r\n\r\nIt'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. \r\n\r\nIt's a duplicate of [my question on stackoverflow](https://stackoverflow.com/q/61192115/3521099).\r\n\r\n#### **Code for reproduction**\r\n\r\n```python\r\nimport matplotlib.pyplot as plt\r\ndef plot():\r\n plt.figure(figsize=[3,3],linewidth=5,edgecolor='r') \r\n ax=plt.subplot()\r\n ax.plot(range(10),range(10),label='label')\r\n ax.set_xlabel('xlabel\\nxlabel\\nxlabel')\r\n ax.set_ylabel('ylabel\\nylabel\\nylabel')\r\n ax.legend(bbox_to_anchor=[1,1])\r\nplot() \r\nplt.savefig('no_tight_layout.png')\r\n```\r\n\r\n#### **Actual outcome**\r\n[![no_tight_layout.png][1]][1]\r\n\r\n\u003c!--The output produced by the above code, which may be a screenshot, console output, etc.--\u003e\r\n\r\n\r\n### **Expected outcome**\r\n\r\nIf 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).\r\n\r\n[![jupyter notebook][3]][3]\r\n\r\nThis figure is generated in the output cell of a jupyter notebook(!). \r\nThen why it is not saved as it is? Why the saved image is by default different from the image jupyter notebook? \r\nIn my opinion this is a very fundamental issue with matplotlib. \r\nWould'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? \r\n \r\n### **(Thanks to stackoverflow), we know few workarounds but each has a caveat of its own**.. \r\n**Workaround #1:** from within matplotlib: use of **`tight_layout`** option.\r\n```\r\nplot() \r\nplt.savefig('tight_layout.png',bbox_inches='tight')\r\n```\r\n\r\n[![tight_layout.png][2]][2]\r\n\r\nIt works for simple figures. \r\n**However**, in my experience, it is not reliable option in the case of more complex, multi-panel figures.\r\n`tight_layout` often fails with errors such as these:\r\n``` \r\nUserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect.\r\nUserWarning: tight_layout not applied: number of rows in subplot specifications must be multiples of one another.\r\n```\r\n\r\n**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.\r\n\r\n**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). \r\n\r\n### **So my question is..**\r\n\r\nWhy doesn't matplotlib save the whole figure by default? \r\n\r\n\r\n\r\n [1]: https://i.stack.imgur.com/PcZgn.png\r\n [2]: https://i.stack.imgur.com/HQl7S.png\r\n [3]: https://i.stack.imgur.com/TJh4r.png\r\n\r\n--------\r\n**Matplotlib version**\r\n\u003c!--Please specify your platform and versions of the relevant libraries you are using:--\u003e\r\n * Operating system: Ubuntu 18.04\r\n * Matplotlib version: 3.1.2 (this is issue reproducible in previous version too.)\r\n * Matplotlib backend (`print(matplotlib.get_backend())`):\r\n * Python version: 3.6.5\r\n * Jupyter version (if applicable): 1.0\r\n * Other libraries: ","author":{"url":"https://github.com/rraadd88","@type":"Person","name":"rraadd88"},"datePublished":"2020-04-13T16:29:35.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3},"url":"https://github.com/17118/matplotlib/issues/17118"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:7e2445e5-7b4e-52a3-9f5f-6734b39c4e01 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 95A2:17AA66:5A4BA0:79D00B:6A51CCF2 |
| html-safe-nonce | 82c80fe5846674127f3991503b4a469e809b8fff0eec5e8e020cb2ef7ed1064b |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5NUEyOjE3QUE2Njo1QTRCQTA6NzlEMDBCOjZBNTFDQ0YyIiwidmlzaXRvcl9pZCI6IjM3ODk4Nzc1Njc1MjExNDgxNDYiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 2212ecb8ceb9be95f50eac598be7023e0989ab869f4ee8fa8b12ab48186056af |
| hovercard-subject-tag | issue:598988229 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/17118/issue_layout |
| twitter:image | https://opengraph.githubassets.com/af8790cf9e6d73b91aff64707bbe13543e4cf2fea5609c65c1cc8d0eadbc1d61/matplotlib/matplotlib/issues/17118 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/af8790cf9e6d73b91aff64707bbe13543e4cf2fea5609c65c1cc8d0eadbc1d61/matplotlib/matplotlib/issues/17118 |
| og:image:alt | 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 la... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | rraadd88 |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7aed05249554b889eb33d002851a973eebcc7e91 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width