散布図へのホバリング注釈の追加
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 サイトの他の関連記事を参照してください。