Heim > Backend-Entwicklung > Python-Tutorial > Wie kann ich schwebende Anmerkungen zu Matplotlib-Streu- und Liniendiagrammen hinzufügen, um Objektnamen beim Mouseover anzuzeigen?

Wie kann ich schwebende Anmerkungen zu Matplotlib-Streu- und Liniendiagrammen hinzufügen, um Objektnamen beim Mouseover anzuzeigen?

Susan Sarandon
Freigeben: 2024-12-09 11:26:11
Original
248 Leute haben es durchsucht

How can I add hovering annotations to Matplotlib scatter and line plots to display object names on mouseover?

Hinzufügen von schwebenden Anmerkungen zu Streudiagrammen

Wenn Sie matplotlib verwenden, um Streudiagramme zu erstellen, bei denen jeder Punkt ein bestimmtes Objekt darstellt, kann es hilfreich sein, Folgendes zu tun: Zeigt den Namen des Objekts an, wenn sich der Cursor über dem entsprechenden Punkt befindet. Dies ermöglicht es Benutzern, Ausreißer oder andere relevante Informationen schnell zu identifizieren, ohne die Darstellung mit permanenten Beschriftungen zu überladen.

Eine Lösung besteht darin, die Annotate-Funktion zu verwenden, um eine Beschriftung zu erstellen, die sichtbar wird, wenn der Cursor über einen bestimmten Punkt fährt. Hier ist ein Beispiel-Codeausschnitt:

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()
Nach dem Login kopieren

Dieser Code definiert ein Streudiagramm mit 15 zufälligen Punkten. Jedem Punkt ist ein Name aus dem Namensarray zugeordnet. Die Annotate-Funktion erstellt eine Beschriftung, die zunächst unsichtbar bleibt.

Die Hover-Funktion ist für die Verarbeitung von Mausbewegungsereignissen definiert. Wenn der Cursor über einen Punkt fährt, prüft er, ob der Punkt im Streudiagramm enthalten ist. Wenn dies der Fall ist, wird die Anmerkung mit dem Namen und der Position des Objekts aktualisiert, es sichtbar gemacht und die Figur neu gezeichnet. Wenn der Cursor den Punkt verlässt, wird die Anmerkung ausgeblendet.

Für Liniendiagramme anstelle von Streudiagrammen kann dieselbe Lösung wie folgt angepasst werden:

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

x = np.sort(np.random.rand(15))
y = np.sort(np.random.rand(15))
names = np.array(list("ABCDEFGHIJKLMNO"))

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

fig, ax = plt.subplots()
line, = plt.plot(x, y, marker="o")

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):
    x, y = line.get_data()
    annot.xy = (x[ind["ind"][0]], y[ind["ind"][0]])
    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_alpha(0.4)


def hover(event):
    vis = annot.get_visible()
    if event.inaxes == ax:
        cont, ind = line.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()
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich schwebende Anmerkungen zu Matplotlib-Streu- und Liniendiagrammen hinzufügen, um Objektnamen beim Mouseover anzuzeigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage