산점도에 호버링 주석 추가
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!