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


80

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

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 데이터 레이블 만 플로팅합니다.

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

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


1
왜 안돼 ax.annotate('(%s, %s)' % (i, j), ...)? (또는 최신 스타일의 문자열 형식을 사용하는 경우 '({}, {})'.format(i, j).)
Joe Kington 2014 년


pyplot.text은 주석의 대안이 될 것 같다 : pythonmembers.club/2018/05/08/... 확실하지가 아무것도 다른 작업을 수행하는 경우 비록
10,762,409는 분석 재개 모니카 말한다

여기 pythonmembers.club관리자 . XD는 초보자로서 저를 자극했습니다. 그 기사는 Stanford uni의 NLP 과정에 포함될만큼 충분히 인기를 얻었습니다 (기사에 대한 대담한 직접 링크)
Abdur-Rahmaan Janhangeer

답변:


95

(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()

여기에 이미지 설명 입력


4
이것을 사용하는 모든 사람을위한 참고 사항 : textcoords = 'offset points'는 그래프의 척도에 따라 변수 효과가있는 것 같습니다 (나에게는 대부분의 레이블이 플롯에서 벗어남)
Eric G

1
예, 대신 textcoords = 'data'를 사용해야합니다.
navari

@navari, 정보 감사합니다. 그에 따라 답변을 업데이트했습니다.
falsetru

@EricG- 매개 변수 textcoords='offset points'도 필요 하다고 생각합니다 xytext. 즉, xytext=(x points, y points)오프셋을 설정 textcoords='offset points'하면 예상대로 작동합니다.
DaveL17

2
백만 개의 3 차원 데이터 포인트가 있다고 가정 해 봅시다. 그중 몇 개를 선택하고 개별적으로 레이블을 지정해야합니다. 어떻게 하시겠습니까?
June Wang

5

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

여기에 이미지 설명 입력

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

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위치가 좋지 않습니다. 범례의 위치를 ​​다루기 어렵 기 때문에 범례와 데이터 포인트 사이에 선을 그리는 것은 엉망입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.