Skip to content
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

Draggable legend with use_blit hides legend after legend picking [Bug]: #28129

Open
dallas74 opened this issue Apr 24, 2024 · 0 comments
Open

Comments

@dallas74
Copy link

Bug summary

Using the legend picking example (https://matplotlib.org/stable/gallery/event_handling/legend_picking.html) and changing the next last line from leg.set_draggable(True) to leg.set_draggable(True, use_blit=True) then legend is not showing after picking it. Clicking again over its position makes it visible again.
Setting the legend draggable again (after being picked/clicked) with use_blit=False does not help.
Best regards, Daniel

Code for reproduction

# https://matplotlib.org/stable/gallery/event_handling/legend_picking.html

import matplotlib.pyplot as plt
import numpy as np

t = np.linspace(0, 1)
y1 = 2 * np.sin(2 * np.pi * t)
y2 = 4 * np.sin(2 * np.pi * 2 * t)

fig, ax = plt.subplots()
ax.set_title('Click on legend line to toggle line on/off')
(line1, ) = ax.plot(t, y1, lw=2, label='1 Hz')
(line2, ) = ax.plot(t, y2, lw=2, label='2 Hz')
leg = ax.legend(fancybox=True, shadow=True)

lines = [line1, line2]
map_legend_to_ax = {}  # Will map legend lines to original lines.

pickradius = 5  # Points (Pt). How close the click needs to be to trigger an event.

for legend_line, ax_line in zip(leg.get_lines(), lines):
    legend_line.set_picker(pickradius)  # Enable picking on the legend line.
    map_legend_to_ax[legend_line] = ax_line


def on_pick(event):
    # On the pick event, find the original line corresponding to the legend
    # proxy line, and toggle its visibility.
    legend_line = event.artist

    # Do nothing if the source of the event is not a legend line.
    if legend_line not in map_legend_to_ax:
        return

    ax_line = map_legend_to_ax[legend_line]
    visible = not ax_line.get_visible()
    ax_line.set_visible(visible)
    # Change the alpha on the line in the legend, so we can see what lines
    # have been toggled.
    legend_line.set_alpha(1.0 if visible else 0.2)
    fig.canvas.draw()


fig.canvas.mpl_connect('pick_event', on_pick)

# Works even if the legend is draggable. This is independent from picking legend lines.
leg.set_draggable(True, use_blit=True)

plt.show()

Actual outcome

The legend is not showing after picking it. Clicking again over its position makes it visible again.

Expected outcome

Legend is visible at all times.

Additional information

No response

Operating system

Windows

Matplotlib Version

3.8.1

Matplotlib Backend

TkAgg

Python version

3.9.7

Jupyter version

No response

Installation

pip

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant