【Python】그림의 눈금 라벨을 취득·편집

10703 단어 파이썬matplotlib
본 기사에서는 import matplotlib.pyplot as plt 이나 fig = plt.figure() 를 전제로 하고 있습니다.

요약



파이썬으로 출력 된 다이어그램의 눈금 레이블을 얻으려면,
  • plt.draw ()로 일단 그림을 확정
  • locs, labs = plt.xticks() 로 눈금 얻기
  • _labs = [ lab.get_text() for lab in labs ] 로 눈금 라벨의 캐릭터 라인을 취득
  • ~ 레이블 문자열 변경 ~
  • plt.xticks (locs, _labs)에서 다이어그램 눈금을 변경합니다.

    라는 절차가 필요합니다.
    또는 직접 labs의 요소를 다시 써도 편집할 수 있습니다(예: labs[0].set_va( 'top' ))
    후자의 방법이, 캐릭터 라인 이외의 편집도 가능하기 때문에 편리한 경우도 있습니다.

    ~이하 해설~

    눈금 획득



    눈금 문자열을 얻을 수 없을 때



    파이썬이 기본적으로 출력하는 눈금을 얻어도 라벨 정보가 포함되지 않을 수 있습니다.
    예를 들면
    plt.plot( [ 5, 7, 6 ] )
    

    실행하면 아래 그림이 표시되지만,



    이 눈금을 취득해도, 라벨의 정보는 '' 가 되어 있습니다. plt.xticks()의 두 번째 반환 값은 문자열이 아닌 matplotlib.text.Text 객체 목록이므로 .get_text()라는 메서드로 문자열을 가져옵니다.
    xlocs, xlabs = plt.xticks()
    print( xlocs ) # [-0.5  0.   0.5  1.   1.5  2.   2.5  3.   3.5]
    print( [ xlab.get_text() for xlab in xlabs ] ) # ['', '', '', '', '', '', '', '', '']
    
    ylocs, ylabs = plt.xticks()
    print( ylocs ) # [4.5 5.  5.5 6.  6.5 7.  7.5 8.  8.5]
    print( [ ylab.get_text() for ylab in ylabs ] ) # ['', '', '', '', '', '', '', '', '']
    

    더 말하면, 지금 출력되고 있는 그림의 눈금보다 상하 좌우에 여분의 눈금(가로축의 -0.5등)이 포함되어 있습니다.
    이것은 Python 측이 「눈금은 현재 미확정으로, 이후도 추가 편집에 따라 적절히 조정합니다」라고 하는 상태이기 때문입니다.
    stackoverflow: Getting empty tick labels before showing a plot in Matplotlib

    그림의 확정 → 눈금 문자열의 취득이 가능하게



    따라서 그림을 일단 확정시키기 위해 plt.draw() 또는 fig.canvas.draw()를 실행합니다.
    그러면 눈금의 문자열도 확정되므로 (표시되는 그림은 변하지 않지만) 그림에 표시되어 있는 문자열을 취득할 수 있게 됩니다.
    plt.plot( [ 5, 7, 6, 8 ] )
    plt.draw()
    
    xlocs, xlabs = plt.xticks()
    print( xlocs ) # [-0.5  0.   0.5  1.   1.5  2.   2.5  3.   3.5]
    print( [ xlab.get_text() for xlab in xlabs ] ) # ['−0.5', '0.0', '0.5', '1.0', '1.5', '2.0', '2.5', '3.0', '3.5']
    
    ylocs, ylabs = plt.yticks()
    print( ylocs ) # [4.5 5.  5.5 6.  6.5 7.  7.5 8.  8.5]
    print( [ ylab.get_text() for ylab in ylabs ] )
    # ['4.5', '5.0', '5.5', '6.0', '6.5', '7.0', '7.5', '8.0', '8.5']
    

    눈금 레이블 업데이트



    이 단계에서도 상하좌우의 여분의 눈금이 포함되어 있으므로, 무편집에서도 다시 plt.xticks( xlocs, xlabs )
    plt.xticks( xlocs, xlabs )
    plt.yticks( ylocs, ylabs )
    



    따라서 그림의 범위를 바꾸고 싶지 않은 경우에는 xlim()
    xmin, xmax = plt.xlim()
    ymin, ymax = plt.ylim()
    plt.xticks( xlocs, xlabs )
    plt.yticks( ylocs, ylabs )
    plt.xlim( xmin, xmax )
    plt.ylim( ymin, ymax )
    # === OR ===
    plt.xticks( xlocs[1:-1], xlabs[1:-1] )
    plt.yticks( ylocs[1:-1], ylabs[1:-1] )
    

    matplotlib.text.Text 클래스에 직접 액세스



    위에서는 눈금 레이블의 문자열을 일단 취득했습니다만, ylim() 그리고 얻어지는 matplotlib.text.Text 클래스에 직접 액세스 하는 것으로, 눈금의 체재를 1개씩 편집할 수 있습니다.
    편집하려면 아래 페이지의 메소드 목록 (xlocs[1:-1])을 사용하십시오. 예를 들어,
    matplotlib 공식: matplotlib.text.Text
    xlocs, xlabs = plt.xticks()
    xlabs[3].set_color( 'red' )
    xlabs[5].set_va( 'center' )
    

    그러면, 가로축의 일부의 색, 높이를 바꾸고 있습니다.


    이를 활용하면 눈금 라벨이 길어질 때 라벨을 교대로 표시할 수도 있습니다.
    stackoverflow: Aligning rotated xticklabels with their respective xticks
  • 좋은 웹페이지 즐겨찾기