Skip to content

Closing figures is done by number #15203

Closed

Description

@vnmabus

Closing figures is done by number

Currently, closing a figure is done using the num attribute in the manager. This can cause problems if there are figures not managed by pyplot, as the number could be the same as a
pyplot-managed figure.

As there are efforts to reduce the dependency on pyplot, such as #14024, this should be changed for those to work well. Alternatively, a way to create a manager which selects an appropiate number could work.

Code for reproduction

import matplotlib.pyplot as plt 

# Figure managed by pyplot 
fig1 = plt.figure() 
 
# Figure not managed by pyplot, but using the same backend 
fig2 = fig = plt.new_figure_manager(1).canvas.figure 

fig1.show() 
fig2.show()

Actual outcome

Closing one figure closes both.

Expected outcome

Closing one figure leaves the other open.

Matplotlib version

  • Operating system: All
  • Matplotlib version: 3.0.3
  • Matplotlib backend (print(matplotlib.get_backend())): Qt5Agg
  • Python version: All

Activity

  1. added this to the v3.3.0 milestone on Sep 6, 2019
  2. tacaswell commented on Sep 6, 2019

    @tacaswell
    Member

    The linkage is only one way, if you close the un-managed figure it closes the managed figure, but not the other way around.

    Alternatively, a way to create a manager which selects an appropriate number could work.

    How do you do that without managing all of the figures?

    As a work around, you can do:

    fig2.canvas.manager.num = str(uuid.uuid4)
    

    which will de-couple everything.


    Somewhat annoyingly, the only place that looks like it actually requires an integer is formatting the initial widow title.

  3. anntzer commented on Sep 7, 2019

    @anntzer
    Contributor

    Somewhat annoyingly, the only place that looks like it actually requires an integer is formatting the initial widow title.

    Actually there's also Figure.__setstate__ which assumes it can assign a number to an unpickled figure with max(plt.get_fignums()) + 1.

  4. tacaswell commented on Sep 7, 2019

    @tacaswell
    Member

    global state + pickling!

  5. jklymak commented on Sep 8, 2019

    @jklymak
    Member

    I'm not up on how this all works, but it seems that pyplot should be keeping track of figure handles, not figure numbers or title strings?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions