Maison > développement back-end > Tutoriel Python > Comment créer des annotations de survol pour les nuages ​​de points dans Matplotlib ?

Comment créer des annotations de survol pour les nuages ​​de points dans Matplotlib ?

DDD
Libérer: 2024-12-14 08:46:10
original
324 Les gens l'ont consulté

How to Create Hovering Annotations for Scatter Plots in Matplotlib?

Comment ajouter des annotations en survol à un tracé

Annoter des points sur un nuage de points est une tâche courante lorsque l'on travaille avec des données. Matplotlib, une bibliothèque Python permettant de créer des tracés 2D, fournit une méthode simple pour ajouter des annotations fixes à un tracé à l'aide de la commande annotate. Cependant, cette approche peut devenir peu pratique lorsqu'il s'agit de traiter de nombreux points de données, car le tracé pourrait devenir encombré.

Heureusement, il existe une solution qui consiste à créer des annotations dynamiques qui n'apparaissent que lorsque le curseur passe sur un point de données spécifique. Cette méthode nécessite une légère modification de la fonction annotate en conjonction avec une fonction de rappel pour gérer les événements du curseur.

Voici un exemple de code démontrant l'implémentation :

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)

x = np.random.rand(15)
y = np.random.rand(15)
names = np.array(list("ABCDEFGHIJKLMNO"))
c = np.random.randint(1, 5, size=15)

norm = plt.Normalize(1, 4)
cmap = plt.cm.RdYlGn

fig, ax = plt.subplots()
sc = plt.scatter(x, y, c=c, s=100, cmap=cmap, norm=norm)

annot = ax.annotate("", xy=(0, 0), xytext=(20, 20), textcoords="offset points",
                    bbox=dict(boxstyle="round", fc="w"),
                    arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)

def update_annot(ind):
    pos = sc.get_offsets()[ind["ind"][0]]
    annot.xy = pos
    text = "{}, {}".format(" ".join(list(map(str, ind["ind"]))),
                           " ".join([names[n] for n in ind["ind"]]))
    annot.set_text(text)
    annot.get_bbox_patch().set_facecolor(cmap(norm(c[ind["ind"][0]])))
    annot.get_bbox_patch().set_alpha(0.4)

def hover(event):
    vis = annot.get_visible()
    if event.inaxes == ax:
        cont, ind = sc.contains(event)
        if cont:
            update_annot(ind)
            annot.set_visible(True)
            fig.canvas.draw_idle()
        else:
            if vis:
                annot.set_visible(False)
                fig.canvas.draw_idle()

fig.canvas.mpl_connect("motion_notify_event", hover)

plt.show()
Copier après la connexion

Ce code ajoute une info-bulle qui apparaît lorsque la souris survole un point de données, affichant ses coordonnées et son nom. La fonction update_annot met à jour dynamiquement la position et le contenu de l'annotation en fonction du point survolé.

Cette approche permet une visualisation sans encombrement avec des informations facilement accessibles sur chaque point de données, ce qui la rend adaptée à l'exploration interactive des données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal