首頁 > 後端開發 > Python教學 > 如何在 Matplotlib 散點圖和線圖添加懸停註釋以在滑鼠懸停時顯示物件名稱?

如何在 Matplotlib 散點圖和線圖添加懸停註釋以在滑鼠懸停時顯示物件名稱?

Susan Sarandon
發布: 2024-12-09 11:26:11
原創
248 人瀏覽過

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

在散點圖上加入懸停註解

使用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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板