首頁 >後端開發 >Python教學 >如何在 Matplotlib 中為散點圖建立懸停註解?

如何在 Matplotlib 中為散點圖建立懸停註解?

DDD
DDD原創
2024-12-14 08:46:10329瀏覽

How to Create Hovering Annotations for Scatter Plots in Matplotlib?

如何在繪圖中加入懸停註解

在散佈圖上註解點是處理資料時的常見任務。 Matplotlib 是一個用於建立 2D 繪圖的 Python 函式庫,它提供了一種使用 annotate 指令為繪圖新增固定註解的簡單方法。然而,在處理大量資料點時,這種方法可能變得不切實際,因為繪圖可能會變得混亂。

幸運的是,有一個解決方案涉及建立僅當遊標懸停在特定資料點上時才出現的動態註解。此方法需要對註解函數進行輕微修改,並結合回呼函數來處理遊標事件。

這是示範實現的範例程式碼:

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

此程式碼新增了一個工具提示,當滑鼠懸停在資料點上時出現,顯示其座標和名稱。 update_annot 函數根據懸停點動態更新註解的位置和內容。

這種方法可以實現整潔的可視化,並且可以輕鬆訪問有關每個數據點的信息,使其適合交互式數據探索。

以上是如何在 Matplotlib 中為散點圖建立懸停註解?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn