[파이썬] 선위에 글씨와 점 그리기(마커 설정)

반응형
반응형

원하는 좌표에 점으로 표현할 수 있다면?

그래프를 그리는 건 어찌어찌 하는데 내가 원하는 곳에 점을 표시하고 글씨를 쓸 수 있으면 더 멋진 그래프를 만들 수 있을겁니다. 멋진 그래프를 그리기 위해 마커설정과 글씨 넣는 방법을 정리해봤습니다.

그래프에 점 넣기

점을 넣으려면 scatter를 이용하면 됩니다. matplotlib는 그래프 겹치기가 가능한 라이브러리라는 것을 이용하면 되는데 다음과 같이 합니다.

import matplotlib.pyplot as plt

# x와 y 좌표 지정
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 18, 20]

# 그래프를 그리기
plt.plot(x, y)

# 원하는 위치에 점 넣기(3,13)
plt.scatter(3, 13, color='red', marker='o', label='Point')

# 레이블을 추가
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 그래프에 범례 추가
plt.legend()

# 그래프 보기
plt.show()

마커 설정

아래 표는 matplotlib 공식 가이드에서 발췌한 마커 설정표입니다. 원하는 모양을 marker 파라미터에 쓰시면 됩니다.

참고로 맨 아래는 mathtext를 입히는 방법인데 \$...\$ 가 아니라 달러만 표시됩니다. \\ 표시는 무시하시기 바랍니다. 블로그에 math 쓰기 설정을 해놨더니 저렇게 나오네요ㅜ

     
marker symbol description
"." m00 point
"," m01 pixel
"o" m02 circle
"v" m03 triangle_down
"^" m04 triangle_up
"<" m05 triangle_left
">" m06 triangle_right
"1" m07 tri_down
"2" m08 tri_up
"3" m09 tri_left
"4" m10 tri_right
"8" m11 octagon
"s" m12 square
"p" m13 pentagon
"P" m23 plus (filled)
"*" m14 star
"h" m15 hexagon1
"H" m16 hexagon2
"+" m17 plus
"x" m18 x
"X" m24 x (filled)
"D" m19 diamond
"d" m20 thin_diamond
"|" m21 vline
"_" m22 hline
0 (TICKLEFT) m25 tickleft
1 (TICKRIGHT) m26 tickright
2 (TICKUP) m27 tickup
3 (TICKDOWN) m28 tickdown
4 (CARETLEFT) m29 caretleft
5 (CARETRIGHT) m30 caretright
6 (CARETUP) m31 caretup
7 (CARETDOWN) m32 caretdown
8 (CARETLEFTBASE) m33 caretleft (centered at base)
9 (CARETRIGHTBASE) m34 caretright (centered at base)
10 (CARETUPBASE) m35 caretup (centered at base)
11 (CARETDOWNBASE) m36 caretdown (centered at base)
'\$...\$' m37 Render the string using mathtext. E.g "$f$" for marker showing the letter f.

출처 : https://matplotlib.org/stable/api/markers_api.html

글씨 쓰기

이번엔 글씨 쓰는 법입니다.
annotate라는 메쏘드를 이용하면 할 수 있습니다.
파라미터가 꽤 있는데 글씨 쓰는데 필요한 주요 파라미터만 설명하겠습니다.

 

matplotlib.pyplot.annotate(text, xy, xytext=None, xycoords='data', textcoords=None, arrowprops=None, annotation_clip=None )

  • text(str) : 그래프에 넣을 문자를 입력합니다.
  • xy(float,float) : text 표시할 위치, 즉, 좌표를 입력합니다.
  • xytext(float,float) : xy에서 다소 떨어지게 만듭니다. 예를 들어, (3,13)에 xy를 지정하면 점과 겹쳐 나옵니다. xytext를 (0,10)으로 설정하면 (3,13)에서 위쪽으로 조금 떨어지게 됩니다.
  • textcoords : xy와 xytext의 좌표시스템을 설정합니다.
    아래 표와 같이 3개 값 중 하나를 넣을 수 있습니다.

 

Value Description
'offset points' Offset, in points, from the xy value
'offset pixels' Offset, in pixels, from the xy value
'offset fontsize' Offset, relative to fontsize, from the xy value
  • horizonalalignmnet or ha : 글정렬입니다. 디폴트는 어울리는 곳으로 하는 것 같습니다(선과 안 닿게되는 곳?).
    {'left','center','right'} 세 개중 하나를 넣으시면 됩니다.

적용하기

아까 위에서 찍은 점의 좌표에 글씨로 표시를 하겠습니다.

import matplotlib.pyplot as plt

# x와 y 좌표 지정
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 18, 20]

# 그래프 그리기
plt.plot(x, y)

# 원하는 위치에 점을 표시하고 좌표를 글씨로 표시하기
x_point = 3
y_point = 13
plt.scatter(x_point, y_point, color='red', marker='o', label='Point')
plt.annotate(f'({x_point}, {y_point})', (x_point, y_point), textcoords="offset points", xytext=(0, 10), ha='center',)

# 레이블 추가
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 범례 추가
plt.legend()

# 그래프 보여주기
plt.show()

화살표 그리기

보통 글씨를 쓰면 보기 편하게 하기 위해서 화살표와 함께 쓰기 마련입니다. 선과 겹치지 않게 글씨도 쓰고 그래프를 좀 더 깔끔하게 할 수 있습니다.

화살표도 annotate 메쏘드를 씁니다.
arrowprops 파라미터를 쓸건데 딕셔너리로 입력해야하고 옵션이 굉장히 많습니다. 이번 포스팅에는 다 담을 수 없어 정리해서 추후에 따로 포스팅하도록 하겠습니다.

간단한 예시입니다.

import matplotlib.pyplot as plt

# x와 y 좌표 지정
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 18, 20]

# 그래프를 그리기
plt.plot(x, y)

# 원하는 위치에 점을 표시하고 좌표를 글씨로 표시하기
x_point = 3
y_point = 13
plt.scatter(x_point, y_point, color='red', marker='o', label='Point')
plt.annotate(f'({x_point}, {y_point})', (2.5, 14.8), textcoords="offset points", xytext=(0, 10), ha='center')

# 화살표를 추가
arrow_start = (2.5, 15)  # 화살표 시작점
arrow_end = (3, 13.7)    # 화살표 끝점
plt.annotate('', arrow_end, arrow_start, arrowprops={'arrowstyle': '->', 'color': 'green'})

# 레이블 추가
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 범례 추가
plt.legend()

# 그래프 보여주기
plt.show()

화살표를 그릴려면 시작점과 끝점을 그립니다. arrowprops의 옵션을 잘 안다면 좌표를 일일히 조정하지 않아도 되지만 그렇지 않다면 좌표를 조정하면서 그리면 어찌어찌 그려집니다. 또한, 글씨와 매칭할 수 있도록 좌표를 잘 지정해주어야 합니다.글씨 좌표도 조정이 필요할수도 있습니다.

마치며

선 위에 글씨와 점 넣는 방법, 화살표 넣는 방법에 대한 내용이었습니다. 메쏘드만 알아도 쉽게 할 수 있습니다. matplotlib는 프레젠테이션보다는 가장 빠르게 원하는 걸 그려내고 시각화하는데에 초점이 맞춰져 있는 거라서 으리으리한 그래프는 그리지 못하지만 적어도 그래프에 내가 표현하고 싶은걸 다 표현한다면 데이터 영감을 받을 때 도움이 될 것 같습니다.

 

함께 보면 좋은 글

[matplotlib] 산포 그래프(scatter)

[matplotlib]plt 라벨(label) 위치설정

마커 가이드 사이트 : https://matplotlib.org/stable/api/markers_api.html

Designed by JB FACTORY