Possible de faire des étiquettes apparaissent lors du survol d'un point de matplotlib?
Je suis à l'aide de matplotlib pour faire des nuages de points. Chaque point du nuage de points est associé à un objet nommé. Je voudrais être en mesure de voir le nom d'un objet lorsque j'ai passez mon curseur sur le point sur le nuage de points associé à cet objet. En particulier, il serait agréable d'être en mesure de voir rapidement les noms des points qui sont des valeurs aberrantes. La chose la plus proche que j'ai pu trouver lors de la recherche ici est la commande annoter, mais qui semble créer une étiquette sur le terrain. Malheureusement, avec le nombre de points que j'ai, le diagramme de dispersion serait illisible si j'ai marqué chaque point. Personne ne sait de façon à créer des étiquettes qui n'apparaissent que lorsque le curseur passe dans le voisinage de ce point?
- Les gens se terminant jusqu'ici par la recherche pourrait également vouloir vérifier la cette réponse, qui est assez complexe, mais peut être adapté selon les besoins.
Vous devez vous connecter pour publier un commentaire.
Il semble qu'aucune des autres réponses ici en fait de répondre à la question. Voici donc un code qui utilise un scatter et montre un annotation sur planant sur le nuage de points.
Parce que les gens tout à coup, voulez utiliser cette solution pour une ligne
plot
au lieu de se disperser, les éléments suivants devraient être de la même solution pourplot
(qui fonctionne un peu différemment).CSS:
Au cas où quelqu'un est à la recherche d'une solution pour les lignes en doubles haches, reportez-vous à Comment faire des étiquettes apparaissent lors du survol d'un point dans plusieurs axes?
Au cas où quelqu'un est à la recherche d'une solution pour la barre de parcelles, veuillez vous reporter à la p. ex. cette réponse.
ind["ind"]
est en fait une liste d'indices pour tous les points sous le curseur de la souris. Cela signifie que le code ci-dessus en fait vous donne accès à tous les points à une position donnée, et pas seulement au plus haut point. Par exemple, si vous avez deux cumul de points, le texte pourrait se lire1 2, B C
ou même1 2 3, B C D
si vous aviez 3 cumul de points.0 8, A I
, (voir image).fig.canvas.draw_idle()
plusieurs fois (il change même le curseur au ralenti). Je l'ai résolu le stockage de l'index précédent et vérifier siind["ind"][0] == prev_ind
. Puis mettre à jour uniquement si vous vous déplacez d'un point à un autre (mise à jour du texte), arrêt en vol stationnaire (faire l'annotation invisible), ou de lancer planant (faire des annotations visibles). Avec ce changement, c'est plus propre et efficace..contains
à tous. Il vous suffit de prendre l'information à partir de la barre elle-même.bar
-comme les graphiques retourne un conteneur deartist
objets, le code ci-dessus ne peut être carrément en double. Pour l'enregistrement, on peut trouver un exemple d'un barre graphique, annoté au milieu de chaque barre sur le curseur.%matplotlib notebook
dans un IPython/Jupyter ordinateur portable.annot.set_ha
,annot.set_va
et modifié xytext, mais ils ne sont pas correctement aligné lors de la redessiné. La boîte est aligné sur les coordonnées xy (fin de la flèche) au lieu de départ de la flèche. Je me retrouve avec la boîte et la flèche sur le bon quadrant mais ils sont l'un au dessus de l'autre, la boîte se cache la flèche. Aucune idée pourquoi?annot.set_hat
etannot.xytext
mais le résultat est le même. Cependant, si je l'appelleax.annotate
avec les mêmes paramètres, la flèche et le texte sont alignées correctement.Cette solution fonctionne quand le curseur d'une ligne sans avoir besoin de cliquer dessus:
matplotlib
...) - est-ce de travailler avecipython
/jupyter
carnets? Est-il aussi travailler lorsqu'il y a plusieurs intrigues secondaires? Ce sujet sur un graphique plutôt qu'un graphe?De http://matplotlib.sourceforge.net/examples/event_handling/pick_event_demo.html :
Le Point et la ligne info-bulles dans matplotlib?
print
la déclaration doit également utiliser des parenthèses pour la compatibilité avec python 3Une légère modification sur un exemple fourni dans http://matplotlib.org/users/shell.html:
Cette trace une ligne droite de la parcelle, comme Sohaib demandait
mpld3 résoudre pour moi.
EDIT (CODE AJOUTÉ):
Vous pouvez vérifier cette exemple
TypeError: array([1.]) is not JSON serializable
.mplcursors a fonctionné pour moi. mplcursors fournit cliquable annotation pour matplotlib. Il est fortement inspiré de mpldatacursor (https://github.com/joferkington/mpldatacursor), avec une très simplifiée de l'API
matplotlib
rend chaque ligne 10 de la même couleur, une telle douleur.mplcursors
sortes il cependant.Les autres réponses ne permettaient pas de répondre à mon besoin d'afficher les info-bulles dans une version récente de Jupyter inline matplotlib figure. Celui-ci fonctionne bien:
Menant à quelque chose comme l'image ci-dessous lorsque vous allez sur un point avec la souris:
Vous êtes à la recherche de quelque chose comme cela.
URL: https://matplotlib.org/2.0.1/examples/pylab_examples/cursor_demo.html
Juste essayer de copier coller et de voir si ça répond à votre exigence.
J'ai cherché beaucoup et la plupart des réponses ont l'impression que les points
après planant ou
les étiquettes ont été élaborés uniquement après la souris cliquez sur l'événement.
Ce (solution dans le lien ci-dessus) combiner les avantages des deux solutions.
J'ai fait un multi-ligne de système d'annotation à ajouter à: https://stackoverflow.com/a/47166787/10302020.
pour les plus up to date de la version:
https://github.com/AidenBurgess/MultiAnnotationLineGraph
Suffit de modifier les données dans la section du bas.