[python] 플롯에서 Python 데이터 포인트에 레이블 지정

정말 성가신 (겉보기에 기본적인) 문제에 대한 답을 찾기 위해 연령 (연령과 비슷한 시간)을 검색했는데, 대답에 맞는 질문을 찾을 수 없기 때문에 질문을 게시하고 그에 대한 희망으로 대답하고 있습니다. 내가 누비 플로팅 기술에 소비 한 엄청난 시간을 다른 사람에게 절약 할 수 있습니다.

python matplotlib를 사용하여 플롯 포인트에 레이블을 지정하려면

from matplotlib import pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

A = anyarray
B = anyotherarray

plt.plot(A,B)
for i,j in zip(A,B):
    ax.annotate('%s)' %j, xy=(i,j), xytext=(30,0), textcoords='offset points')
    ax.annotate('(%s,' %i, xy=(i,j))

plt.grid()
plt.show()

xytext = (30,0)이 텍스트 좌표와 함께 이동한다는 것을 알고 있습니다.이 30,0 값을 사용하여 데이터 레이블 지점을 배치하므로 0 y 축에, 30은 x 축에있는 작은 영역에 있습니다.

i와 j를 플로팅하는 선이 모두 필요합니다. 그렇지 않으면 x 또는 y 데이터 레이블 만 플로팅합니다.

다음과 같은 결과를 얻을 수 있습니다 (레이블 만 확인).
레이블이 지정된 데이터 포인트가있는 내 플롯

이상적이지 않고 여전히 겹치는 부분이 있지만 내가 가진 것보다 낫습니다 ..



답변

(x, y)한 번 에 인쇄하는 것은 어떻습니까 ?

from matplotlib import pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

A = -0.75, -0.25, 0, 0.25, 0.5, 0.75, 1.0
B = 0.73, 0.97, 1.0, 0.97, 0.88, 0.73, 0.54

plt.plot(A,B)
for xy in zip(A, B):                                       # <--
    ax.annotate('(%s, %s)' % xy, xy=xy, textcoords='data') # <--

plt.grid()
plt.show()

여기에 이미지 설명 입력


답변

나는 비슷한 문제가 있었고 이것으로 끝났습니다.

여기에 이미지 설명 입력

나에게 이것은 데이터와 주석이 겹치지 않는다는 장점이 있습니다.

from matplotlib import pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)

A = -0.75, -0.25, 0, 0.25, 0.5, 0.75, 1.0
B = 0.73, 0.97, 1.0, 0.97, 0.88, 0.73, 0.54

plt.plot(A,B)

# annotations at the side (ordered by B values)
x0,x1=ax.get_xlim()
y0,y1=ax.get_ylim()
for ii, ind in enumerate(np.argsort(B)):
    x = A[ind]
    y = B[ind]
    xPos = x1 + .02 * (x1 - x0)
    yPos = y0 + ii * (y1 - y0)/(len(B) - 1)
    ax.annotate('',#label,
          xy=(x, y), xycoords='data',
          xytext=(xPos, yPos), textcoords='data',
          arrowprops=dict(
                          connectionstyle="arc3,rad=0.",
                          shrinkA=0, shrinkB=10,
                          arrowstyle= '-|>', ls= '-', linewidth=2
                          ),
          va='bottom', ha='left', zorder=19
          )
    ax.text(xPos + .01 * (x1 - x0), yPos,
            '({:.2f}, {:.2f})'.format(x,y),
            transform=ax.transData, va='center')

plt.grid()
plt.show()

텍스트 인수를 사용하면 텍스트 .annotate위치가 좋지 않습니다. 범례의 위치를 ​​다루기 어렵 기 때문에 범례와 데이터 포인트 사이에 선을 그리는 것은 엉망입니다.


답변