Salut à tous !

Je tente de réaliser des figures interactives avec Matplotlib. Soit le code suivant, qui permet de faire apparaître ou disparaître une courbe lorsqu’on clique sur la ligne de sa légende (il faut bien cliquer sur la ligne) – en passant, ce code n’est pas de moi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import numpy as np
import matplotlib.pyplot as plt
 
 
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]
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
 
 
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)
    # 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)
    fig.canvas.draw()
 
fig.canvas.mpl_connect('pick_event', on_pick)
plt.show()
J’ai testé ce code sous Linux et il fonctionne comme attendu. Il m’a été rapporté qu’il fonctionne également sous Windows.

En revanche, le comportement sous macOS est étrange : lorsque l’on clique sur la ligne de légende, la courbe ne disparaît pas, mais en revanche, si on change la taille de la fenêtre, alors la courbe disparaît. Il semble que le graphique n’est pas mis à jour. Je dois avoir oublié quelque chose – encore que je ne comprends pas vraiment la différence de comportement entre les systèmes, mais passons. J’ai cherché sur le net et je n’ai rien trouvé pour m’aider. Est-ce que quelqu’un sait comment corriger ce problème ?

À bientôt.