Title: [MNT]: Lifetime of pyplot figures · Issue #29849 · matplotlib/matplotlib · GitHub
Open Graph Title: [MNT]: Lifetime of pyplot figures · Issue #29849 · matplotlib/matplotlib
X Title: [MNT]: Lifetime of pyplot figures · Issue #29849 · matplotlib/matplotlib
Description: Summary Inspired by but technically orthogonal to the recent discussions #29782, #29836: Can we change the lifetime behavior so that (1) users have to care/know less about how pyplot manages the figure - ideally no close() is needed - an...
Open Graph Description: Summary Inspired by but technically orthogonal to the recent discussions #29782, #29836: Can we change the lifetime behavior so that (1) users have to care/know less about how pyplot manages the fi...
X Description: Summary Inspired by but technically orthogonal to the recent discussions #29782, #29836: Can we change the lifetime behavior so that (1) users have to care/know less about how pyplot manages the fi...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/29849
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[MNT]: Lifetime of pyplot figures","articleBody":"### Summary\n\nInspired by but technically orthogonal to the recent discussions #29782, #29836: Can we change the lifetime behavior so that (1) users have to care/know less about how pyplot manages the figure - ideally no `close()` is needed - and (2) we do not break typical existing usage patterns?\n\n### Proposed fix\n\nObservations / Questions:\n1) Why does `pyplot` has to keep a figure reference?\n - 1.1: This prevents garbage collection if the user does not store the figure in a variable.\n - 1.2: It allows managing multiple figures to change the *current figure*.\n - 1.3: It manages the figure interactions if the figure is shown.\n2) It is unlikely that people manage a lot of figures in parallel through the pyplot state - (if you have 20 figures, you'll propably not organize them through pyplot - or if you do, you at least assign dedicated fignums when creating them)\n\nThis combination tells me there is a space for criterions to auto-delete figures:\n\nOne interpretation could be: a figure is not needed anymore if all of the following apply:\n- the figure is not shown (no interaction possible)\n- the figure is not the active figure (it's currently not worked on)\n- the figure does not have a user-created fignum (it's not possible to make the figure active again)\n\nThis would effectively mean that you only have muliple figures tracked in pyplot if either they are currently shown or they have explicit user-created fignums. Conversely, figures without user-created fignums are auto-deleted when appropriate.\nIMHO this is a very reasonable logic and removes the need to understand pyplot tracking or use of `close` for almost all users.\n\nThere's only one minor use case I can imagine that would get broken by this: Users relying on the implictly created fignumbers for changing the active figure:\n```\nplt.figure() # num=1\nplt.plot()\n\nplt.figure() # num=2\nplt.plot()\n\nplt.figure(1) # knowing that the first figure() call auto-assigned num=1\n```\nBut this behavior is brittle anyway because you have to know that you're in a fresh interpreter. There are three mitigation strategies:\n- deprecate recalling a figure with an implicitly created figure number\n- keep the last N (e.g. 5) implicitly created figures still around. This recall by implicit number may be feasible for one or two figures but nobody can do this for many figures\n- don't care as this is a brittle edge-case, which people should not be using anyway","author":{"url":"https://github.com/timhoffm","@type":"Person","name":"timhoffm"},"datePublished":"2025-04-01T12:27:51.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7},"url":"https://github.com/29849/matplotlib/issues/29849"}
| 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:c1ba093b-a152-a268-7a1e-1d1cb3c81540 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | DE64:3C3FC2:ECCF1:1494EC:6A52698A |
| html-safe-nonce | d8d0a4559b8b2114739bba150b1f3d7409d8be070d74987863bc2eec1d552621 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJERTY0OjNDM0ZDMjpFQ0NGMToxNDk0RUM6NkE1MjY5OEEiLCJ2aXNpdG9yX2lkIjoiMjcwNzI3OTIyMzQ3ODI5NjQyIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 5e3c1a6d72ce4bd37024d462fa22995f7482158b5338b18e0aae10e36ada3b46 |
| hovercard-subject-tag | issue:2963296277 |
| 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/29849/issue_layout |
| twitter:image | https://opengraph.githubassets.com/6d5220e237f5a9a05e99382f73b61db2512a610e368f447040be7292fa587c3e/matplotlib/matplotlib/issues/29849 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/6d5220e237f5a9a05e99382f73b61db2512a610e368f447040be7292fa587c3e/matplotlib/matplotlib/issues/29849 |
| og:image:alt | Summary Inspired by but technically orthogonal to the recent discussions #29782, #29836: Can we change the lifetime behavior so that (1) users have to care/know less about how pyplot manages the fi... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | timhoffm |
| 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 | 07a982c1d40157c619b364352b704c3ce66bb332 |
| ui-target | canary-1 |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width