在散點圖上加入懸停註解
使用matplotlib 建立每個點代表一個特定物件的散佈圖時,它會很有幫助當遊標懸停在相應點上時顯示物件的名稱。這允許用戶快速識別異常值或其他相關訊息,而不會用永久標籤弄亂繪圖。
一種解決方案涉及使用註解功能建立一個標籤,當遊標懸停在特定點上時該標籤變得可見。以下是範例程式碼片段:
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()
此程式碼定義了包含 15 個隨機點的散佈圖。每個點都與名稱數組中的一個名稱相關聯。 annotate 函數建立一個原本不可見的標籤。
hover 函數定義為處理滑鼠移動事件。當遊標懸停在某個點上時,它會檢查該點是否包含在散佈圖中。如果是這樣,它會使用物件的名稱和位置更新註釋,使其可見,並重新繪製圖形。當遊標離開該點時,註釋被隱藏。
對於線圖而不是散點圖,可以採用相同的解決方案,如下所示:
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()
以上是如何在 Matplotlib 散點圖和線圖添加懸停註釋以在滑鼠懸停時顯示物件名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!