Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Improve legend picking example
* Pass an actual pickradius instead of `True`. `True` (`1`) is a bad
user experience.
* Fix `on_pick` to work when the legend is draggable. (Early exit)
* For good measure, show that it works with draggable legends.
* Use higher visability syntax for single element destrturing for higher
readability.
* Refactor varible names. (`lined` -> `map_legend_to_ax`)
  • Loading branch information
Joshua Stevenson
Joshua Stevenson committed Oct 26, 2023
commit 641a5b699812e1781435f05651a0fc5ee88a9e5b
39 changes: 26 additions & 13 deletions galleries/examples/event_handling/legend_picking.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,33 +18,46 @@
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)
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')
(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]
lined = {} # Will map legend lines to original lines.
for legline, origline in zip(leg.get_lines(), lines):
legline.set_picker(True) # Enable picking on the legend line.
lined[legline] = origline
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.
legline = event.artist
origline = lined[legline]
visible = not origline.get_visible()
origline.set_visible(visible)
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.
legline.set_alpha(1.0 if visible else 0.2)
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)

plt.show()