Python/matplotlib

[python matplotlib] pyplot 주석 달기 - annotate

언제나휴일 2020. 11. 23. 11:31
반응형

안녕하세요. 언제나휴일입니다.

이번에는 pyplot으로 주석을 나타내는 annotate를 사용해 봅시다.

 

0. 함수 원형

#주석 달기
#matplotlib.pyplot.annotate(s, xy, *args, **kwargs)
#    s: str
#    xy: (float, float)
#선택
#    xytext: (float, float), defaults:xy
#    xycoords: str
#        'figure points'	Points from the lower left of the figure
#        'figure pixels'	Pixels from the lower left of the figure
#        'figure fraction'	Fraction of figure from lower left
#        'axes points'	Points from lower left corner of axes
#        'axes pixels'	Pixels from lower left corner of axes
#        'axes fraction'	Fraction of axes from lower left
#        'data'	Use the coordinate system of the object being annotated (default)
#        'polar'	(theta,r) if not native 'data' coordinates
#    textcoords: str
#         'offset points'	Offset (in points) from the xy value
#         'offset pixels'	Offset (in pixels) from the xy value
#    arrowprops: dict
#    annotation_clip: bool

1. 주석 달기

annotate 함수에는 주석 내용(s)과 좌표(xy)는 필수로 전달해 주어야 합니다.

import matplotlib.pyplot as plt

#1. 주석 달기(s, xy)
plt.annotate("annotate",(0.2,0.5))
plt.show()

주석 달기

2. xytext

주석을 표시할 xy좌표를 설정할 때 사용합니다.

디폴트 값은 xy와 같습니다.

아래의 사용 예에서 xy는 아무런 의미도 없습니다.

* 옵션에 따라 xy가 텍스트의 xy좌표가 아닌 다른 의미로 사용할 때가 있습니다.

#2.xytext: (float, float), defaults:xy
plt.annotate('annotate - xytext(0.1,0.1)', xy=(0.2, 0.5), xytext=(0.1, 0.1) )
plt.show()

xytext로 출력 좌표 설정

3. xycoords

'figure points' 는 그림의 Point 좌표로 출력합니다.

'figure pixels' 는 그림의 Pixel 좌표로 출력합니다.

'figure fraction'은 그림의 좌표를 기준으로 출력합니다.

'axes points'는 좌표 축을 기준으로 Point 좌표로 출력합니다.

'axes pixels'는 좌표 축을 기준으로 Pixel 좌표로 출력합니다.

'axes fraction'은 좌표 축을 기준으로 출력합니다.

'data' 는 좌표 시스템의 데이터로 취급합니다. 좌표 축을 이동하면 맞춰서이동합니다.

'polar'는 xy값을 극좌표 값(theta,r)으로 취급합니다. 좌표 축을 이동하면 맞춰서 이동합니다.

#3.xycoords: str
#        'figure points'	Points from the lower left of the figure
#        'figure pixels'	Pixels from the lower left of the figure
#        'figure fraction'	Fraction of figure from lower left
#        'axes points'	Points from lower left corner of axes
#        'axes pixels'	Pixels from lower left corner of axes
#        'axes fraction'	Fraction of axes from lower left
#        'data'	Use the coordinate system of the object being annotated (default)
#        'polar'	(theta,r) if not native 'data' coordinates
plt.annotate("annotate - xycoords('figure points')", xy=(0, 10), xycoords='figure points' )
plt.annotate("annotate - xycoords('figure pixels')", xy=(0, 30), xycoords='figure pixels')
plt.annotate("annotate - xycoords('figure fraction')", xy=(0.2, 0.3), xycoords='figure fraction' )
plt.annotate("annotate - xycoords('axes points')", xy=(0, 10), xycoords='axes points' )
plt.annotate("annotate - xycoords('axes pixels')", xy=(0, 30), xycoords='axes pixels' )
plt.annotate("annotate - xycoords('axes fraction')", xy=(0.2, 0.6), xycoords='axes fraction' )
plt.annotate("annotate - xycoords('data')", xy=(0.2, 0.7), xycoords='data' )
plt.annotate("annotate - xycoords('polar')", xy=(0.2, 0.8), xycoords='polar' )
plt.show()

좌표 축을 이동하기 전
좌표 축을 이동시키고 난 후

4. 극좌표 사용 예

극좌표 사용 예를 Look & Feel 합시다.

xy값은 theta, radius로 취급합니다. 다음은 theta값은 0~2pi로 1도씩 변경하고 반지름은 1로 출력한 예입니다.

#4.xycoords='polar'
for theta in range(0,360):
    plt.annotate(".", xy=(theta/180*3.14,1), xycoords='polar' )
plt.show()

polar 사용 예

5. textcoords

'offset points' 는 xy(좌표 측의 값)에서부터 xytext offset 위치(단위 point)에 출력

'offset pixels' 는 xy(좌표 측의 값)에서부터 xytext offset 위치(단위 pixel)에 출력

#5. textcoords
#    textcoords: str
#         'offset points'	Offset (in points) from the xy value
#         'offset pixels'	Offset (in pixels) from the xy value
plt.annotate("annotate - textcoords('offset points')", xy=(0, 0.2),xytext=(0,0), textcoords='offset points' )
plt.annotate("annotate - textcoords('offset pixels')", xy=(0, 0.2),xytext=(0,20), textcoords='offset pixels' )
plt.show()

textcoords 사용

6. arrowprops : dict

화살표 특성을 설정합니다.

#6. arrowprops: dict
arrowprops = dict(color='violet',arrowstyle="-|>")
plt.annotate("annotate - arrowprops", xy=(0.1, 0.3),xytext=(0.2,0.2),arrowprops=arrowprops)
plt.show()

화살표 설정

7. annotation_clip

주석이 좌표를 벗어났을 때 그릴지 여부를 결정합니다.

#7. annotation_clip: bool, default None
plt.annotate("annotate - annotation_clip=False", xy=(0, -0.1),annotation_clip=False)
plt.annotate("annotate - annotation_clip=True", xy=(0.5, -0.1),annotation_clip=True)
plt.show()

좌표가 벗어날 때 annotaion_clip=True인 데이터는 표시하지 않음
좌표가 벗어나지 않을 때 둘 다 보임

8. 전체 코드

#주석 달기
#matplotlib.pyplot.annotate(s, xy, *args, **kwargs)
#    s: str
#    xy: (float, float)
#선택
#    xytext: (float, float), defaults:xy
#    xycoords: str
#        'figure points'	Points from the lower left of the figure
#        'figure pixels'	Pixels from the lower left of the figure
#        'figure fraction'	Fraction of figure from lower left
#        'axes points'	Points from lower left corner of axes
#        'axes pixels'	Pixels from lower left corner of axes
#        'axes fraction'	Fraction of axes from lower left
#        'data'	Use the coordinate system of the object being annotated (default)
#        'polar'	(theta,r) if not native 'data' coordinates
#    textcoords: str
#         'offset points'	Offset (in points) from the xy value
#         'offset pixels'	Offset (in pixels) from the xy value
#    arrowprops: dict
#    annotation_clip: bool
import matplotlib.pyplot as plt

#1. 주석 달기(s, xy)
plt.annotate("annotate",(0.2,0.5))
plt.show()


#2.xytext: (float, float), defaults:xy
plt.annotate('annotate - xytext(0.1,0.1)', xy=(0.2, 0.5), xytext=(0.1, 0.1) )
plt.show()
#3.xycoords: str
#        'figure points'	Points from the lower left of the figure
#        'figure pixels'	Pixels from the lower left of the figure
#        'figure fraction'	Fraction of figure from lower left
#        'axes points'	Points from lower left corner of axes
#        'axes pixels'	Pixels from lower left corner of axes
#        'axes fraction'	Fraction of axes from lower left
#        'data'	Use the coordinate system of the object being annotated (default)
#        'polar'	(theta,r) if not native 'data' coordinates
plt.annotate("annotate - xycoords('figure points')", xy=(0, 10), xycoords='figure points' )
plt.annotate("annotate - xycoords('figure pixels')", xy=(0, 30), xycoords='figure pixels')
plt.annotate("annotate - xycoords('figure fraction')", xy=(0.2, 0.3), xycoords='figure fraction' )
plt.annotate("annotate - xycoords('axes points')", xy=(0, 10), xycoords='axes points' )
plt.annotate("annotate - xycoords('axes pixels')", xy=(0, 30), xycoords='axes pixels' )
plt.annotate("annotate - xycoords('axes fraction')", xy=(0.2, 0.6), xycoords='axes fraction' )
plt.annotate("annotate - xycoords('data')", xy=(0.2, 0.7), xycoords='data' )
plt.annotate("annotate - xycoords('polar')", xy=(0.2, 0.8), xycoords='polar' )
plt.show()

#4.xycoords='polar'
for theta in range(0,360):
    plt.annotate(".", xy=(theta/180*3.14,1), xycoords='polar' )
plt.show()
#5. textcoords
#    textcoords: str
#         'offset points'	Offset (in points) from the xy value
#         'offset pixels'	Offset (in pixels) from the xy value
plt.annotate("annotate - textcoords('offset points')", xy=(0, 0.2),xytext=(0,0), textcoords='offset points' )
plt.annotate("annotate - textcoords('offset pixels')", xy=(0, 0.2),xytext=(0,20), textcoords='offset pixels' )
plt.show()
#6. arrowprops: dict
arrowprops = dict(color='violet',arrowstyle="-|>")
plt.annotate("annotate - arrowprops", xy=(0.1, 0.3),xytext=(0.2,0.2),arrowprops=arrowprops)
plt.show()
#7. annotation_clip: bool, default None
plt.annotate("annotate - annotation_clip=False", xy=(0, -0.1),annotation_clip=False)
plt.annotate("annotate - annotation_clip=True", xy=(0.5, -0.1),annotation_clip=True)
plt.show()
반응형