>백엔드 개발 >파이썬 튜토리얼 >마우스 오버 시 객체 이름을 표시하기 위해 Matplotlib 분산 및 선 플롯에 호버링 주석을 추가하려면 어떻게 해야 합니까?

마우스 오버 시 객체 이름을 표시하기 위해 Matplotlib 분산 및 선 플롯에 호버링 주석을 추가하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-09 11:26:11243검색

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개의 임의 점으로 구성된 산점도를 정의합니다. 각 포인트는 이름 배열의 이름과 연결됩니다. 주석 기능은 처음에는 보이지 않는 라벨을 생성합니다.

호버 기능은 마우스 이동 이벤트를 처리하도록 정의됩니다. 커서를 점 위로 가져가면 해당 점이 분산형 차트 내에 포함되어 있는지 확인합니다. 그렇다면 객체의 이름과 위치로 주석을 업데이트하고 표시한 다음 그림을 다시 그립니다. 커서가 점을 벗어나면 주석이 숨겨집니다.

산점도 대신 선 도표의 경우 동일한 솔루션을 다음과 같이 조정할 수 있습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.