ホームページ > バックエンド開発 > 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 を使用して各点が特定のオブジェクトを表す散布図を作成する場合、次のことが役立つことがあります。対応する点の上にカーソルを置くと、オブジェクトの名前が表示されます。これにより、ユーザーは永続的なラベルでプロットを乱雑にすることなく、外れ値やその他の関連情報をすばやく識別できます。

解決策の 1 つは、注釈機能を使用して、カーソルが特定の点の上にあるときに表示されるラベルを作成することです。コード スニペットの例を次に示します。

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 個のランダムな点を含む散布図を定義します。各ポイントは、names 配列の名前に関連付けられます。 annotate 関数は、最初は非表示のままのラベルを作成します。

hover 関数は、マウス移動イベントを処理するために定義されています。カーソルが点の上に移動すると、その点が散布図内に含まれているかどうかがチェックされます。存在する場合、オブジェクトの名前と位置で注釈を更新し、オブジェクトを表示して、Figure を再描画します。カーソルがポイントから離れると、注釈は非表示になります。

散布図の代わりに折れ線グラフの場合、同じ解決策を次のように適用できます:

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート