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!