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

반응형
    반응형

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

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

    그래프에 점 넣기

    점을 넣으려면 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

    ....