Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah saya boleh menambah anotasi berlegar pada serakan Matplotlib dan plot garisan untuk memaparkan nama objek pada tetikus?

Bagaimanakah saya boleh menambah anotasi berlegar pada serakan Matplotlib dan plot garisan untuk memaparkan nama objek pada tetikus?

Susan Sarandon
Susan Sarandonasal
2024-12-09 11:26:11245semak imbas

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

Menambah Anotasi Berlegar pada Plot Sebarkan

Apabila menggunakan matplotlib untuk mencipta plot serakan di mana setiap titik mewakili objek tertentu, ia boleh membantu paparkan nama objek apabila kursor melayang di atas titik yang sepadan. Ini membolehkan pengguna mengenal pasti pencilan atau maklumat lain yang berkaitan dengan cepat tanpa mengacaukan plot dengan label kekal.

Satu penyelesaian melibatkan penggunaan fungsi anotasi untuk mencipta label yang menjadi kelihatan apabila kursor menuding pada titik tertentu. Berikut ialah contoh coretan kod:

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()

Kod ini mentakrifkan plot taburan dengan 15 titik rawak. Setiap titik dikaitkan dengan nama daripada tatasusunan nama. Fungsi anotasi mencipta label yang pada mulanya kekal tidak kelihatan.

Fungsi tuding ditakrifkan untuk mengendalikan peristiwa pergerakan tetikus. Apabila kursor melayang di atas satu titik, ia menyemak sama ada titik itu terkandung dalam plot serakan. Jika ya, ia mengemas kini anotasi dengan nama dan kedudukan objek, menjadikannya kelihatan dan melukis semula angka itu. Apabila kursor meninggalkan titik, anotasi disembunyikan.

Untuk plot garis dan bukannya plot berselerak, penyelesaian yang sama boleh disesuaikan seperti berikut:

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()

Atas ialah kandungan terperinci Bagaimanakah saya boleh menambah anotasi berlegar pada serakan Matplotlib dan plot garisan untuk memaparkan nama objek pada tetikus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn