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