본문 바로가기
Python/Matplotlib

레전드(legend, 범례)의 작성법, 위치설정, 다중레전드 - matplotlib(11)

by 콩돌 2019. 5. 7.
반응형

파이썬 버전 3.7 기준

matplotlib 버전 3.0.3 기준



  plot의 레전드(legend)의 작성법


본 포스팅에서는 레전드의 작성법과, 위치설정, 그리고 다중 레전드의 작성법을 다룬다.


레전드와 관련된 간한 용어설명을 하자면 다음과 같다.


레전드 항목(legend entry)

레전드는 하나 혹은 하나 이상의 레전드 항목으로 구성되어진다.

레전드 항목은 하나의 키와 하나의 라벨로 구성되어진다.

 

레전드 키(legend key)

레전드 라벨 왼쪽에 레전드 키는 컬러가 입혀지고 패턴이있는 마커이다.


레전드 라벨(legend label)

키에 의해 나타내어지는 핸들을 설명하는 텍스트이다.


레전드 핸들(legend handle)

레전드 안에 고유한 항목(데이터)을 만드는데 사용되는 오브젝트이다.


본 포스팅에서 다루는 함수들은 pyplot 모듈에 포함되어있다. 따라서 사용하기 위해서 아래와 같이 pyplot 모듈을 임폴트 해야한다. 


import matplotlib.pyplot as plt


  레전드(legend)의 작성법


  legend(*args, **kwargs)

이 함수는 레전드를 그래프(axes)에 위치하게 한다. 즉, 하나의 그래프안에 위치하도록 설정한다. 


레전드는 크게 3가지 방법으로 생성될 수 있다.
  ① 자동기능을 이용한 작성
  ② 이미 입력된 플롯 요소에 대한 라벨링을 통한 작성
  ③ 데이터와 라벨의 직접 매칭

각 방법의 사용 형식은 아래와 같으며 각 방식에 대한 자세한 설명은 바로 아래 섹션에서 다룬다.

각 방식의 간단한 사용 형식)

legend()                     # ①번 방식

legend(labels)              # ②번 방식

legend(handles, labels)  # ③번 방식



  ① 자동기능을 이용한 작성

이 방식은 레전드에 보여지는 요소를 자동으로 감지하여 레전드를 작성하도록한다.

사용자가 추가적인 입력변수를 작성했다면, 레전드에 추가되는 요소는 자동으로 설정될 수 있다. 

이렇게 자동으로 설정하는 경우 레전드에 삽입되는 라벨은 artist에서 얻어진다. 

  ▷ 사용자는 artist가 생성되거나 artist에 대해 set_label() 메서드가 호출될 때 라벨을 명시할 수 있다.

라벨에 언더스코어(_)를 앞에 붙여서 이름을 정한다면, 플롯 라인(데이터)은 자동 레전드 요소선택으로부터 제외된다.

  ▷ 이것은 모든 artist에 대한 기본값이고, 그래서 Axes를 호출한다. 

  ▷ 어떠한 입력변수가 없거나 사용자가 직접 라벨을 세팅 하지 않은 경우는 레전드가 그려지지 않는다.


사용 예제)

# plot 작성

In[4]: plt.plot([1,2,3], label='Label 1')

In[5]: plt.plot([3,2,1], label='_Label 2')  # 자동 레전드 작성하지 않게 설정한 라벨


# 자동 레전드 작성

In[6]: plt.legend()    # 자동 방식을 이용한 레전드 작성

Out[6]: <matplotlib.legend.Legend at 0x11c1d650>



  ② 이미 입력된 플롯 요소에 대한 라벨링을 통한 작성

플롯에 데이터가 입력되어 이미 플롯이 작성된 경우에는 라벨링을 직접 하는 것이 가능하다.


하나의 그래프(axes)에 존재하는 라인에 레전드를 만들기 위해 다음과 예제와 같이 하면된다. 

  ▷ legend() 함수를 불러오면서 이때 요소는 문자열(string, str)로 구성된 이터레이블(iterable)한 자료형을 입력하여주면 된다.


사용 형식)

legend(labels_data)              # 입력 순서 이용

legend(labels=labels_data)              # 키워드 인자 이용


사용 예제)

# plot 작성

In[7]: plt.plot([1,2,3], label='Label 1')

In[8]: plt.plot([3,2,1], label='_Label 2')


# 레전드의 입력

In[9]: plt.legend(['A','B'])    # 라벨명을 직접 입력

Out[9]: <matplotlib.legend.Legend at 0xf77ccd0>


참고사항

  이 방법은 권장되지 않는 방법이다. 

  플롯 요소와 라벨간의 관계가 이 방법에 의해서 불분명해지고, 순서가 쉽게 섞일 가능성이 크다.



   데이터와 라벨의 직접 매칭

레전드에 보여질 라벨과 데이터의 관계를 명확히 정의하여 레전드를 작성할 수 있다. 


아티스트(artist)가 레전드 항목을 완벽하게 제어 할 수 있도록, 이터레이블(iterable)한 자료형을 통해 레전드 아티스트와 레전드 라벨을 각각 전달하는 것이 가능하다.


사용 형식)

legend(handles_data, labels_data)  # 순서 이용

legend(handles=handles_data, labels=labels_data)  # 키워드 인자 이용


사용 예제)

# plot 작성

In[19]: line1, = plt.plot([1,2,3])

In[20]: line2, = plt.plot([3,2,1])


# 데이터와 라벨을 직접 매칭하여 레전드 입력

In[21]: plt.legend(handles=(line2, line1), labels=('a', 'b'))

Out[21]: <matplotlib.legend.Legend at 0xf9a0290>



  레전드의 위치 설정과 다중 레전드


  레전드의 위치 설정, loc와 bbox_anchor 입력변수

레전드의 위치를 대략적으로 설정하고자 한다면 키워드 입력변수인 loc를 사용하면 된다. 

loc의 입력 값은 아래와 같으며, 상세한 내용을 알고자 한다면 이곳(링크)에서 참고할 수 있다.

  ▷ 'best' : 자동으로 계산하여 최적의 위치에 레전드를 위치시킨다.

  ▷ 그 외에 사용자가 직접 대략적으로 명시할 수 있는대 그 입력값은 아래와 같다. 

    - 'upper right', 'upper left', 'upper center'

    - 'lower right',  'lower left', 'lower center', 

    - 'center', 'right', 'center left', 'center right'


bbox_anchor 키워드를 이용하면 사용자가 정확한 위치에 레전드를 위치시킬 수 있다.

  ▷ 입력은 2개 혹은 4개 요소를 포함한 이터레이블로 받는다. 

    - (x, y, width, height)로 구성되어 있으며, width와 height는 생략이 가능하다.

    - x와 y는 박스의 좌표를 의미하며, width와 height는 박스의 너비와 높이를 의미한다.

  ▷ 위치 조절은 아래와 설명과 같이 진행하면 된다.

    - 각 값의 크기의 기준은 그래프(axes)의 크기에 비례하여 입력하면 된다. 예를들어 (x, y)값이 (0, 0) 이면 왼쪽 아래 구석을 의미하며 (1.0, 1.0)이면 오른쪽 위쪽 구석을 의미한다.

    - 사용자가 그래프 레전드를 그래프(axes)의 밖에 그리고 Figure의 구석에 위치시키고 싶다면 1.0을 초과하는 값이나 음수값을 입력하여 위치를 조절하면 된다.


사용 형식)

legend(loc='best')              # 레전드의 위치조정

legend(bbox_anchor=(x, y, width, height))              # 키워드 인자 이용


사용 예제)

# plot 작성

In[41]: line1, = plt.plot([1,2,3], label='X')


# loc와 bbox_anchor 입력을 통한 레전드 위치설정

In[42]: plt.legend(bbox_to_anchor=(1.0,1.0,0.25,0.25), loc='center')

Out[42]: <matplotlib.legend.Legend at 0xeddf810>



  하나의 그래프(Axes)에 다중 레전드 입력

하나의 그래프에 여러 개의 레전드로 나누어 입력하는 것이 가능하다.

  ▷ 레전드 항목을 나누어 여러 개의 레전드를 입력하는 것이 매우 명확하게 정보를 전달할 수 있는 때에 사용하면 매우 유용하다.


다중 레전드를 이용하기 위해 legend()함수를 여러 번 불러와 사용하면 될 것처럼 보이지만, 이런 경우 하나의 레전드만 생성되게 된다.

  ▷ 레전드를 작성하고 재작성하는 경우 해당 레전드 아티스트에 덮어씌우기를 해서 그렇다. 


따라서, 반복적으로 legend()함수를 불러와 수행하는 접근방법은 개념적으로는 맞지만 추가적인 조작이 더 필요하다.

  ▷ 레전드 자체를 사용자가 수동으로 현재의 그래프(axes)에 아티스트로서 등록해주는 작업이 필요하다.


다음 예제는 다중 레전드를 작성하는 예제이다.


사용 예제)

# plot 작성

In[50]: line1, = plt.plot([1,2,3], label='a')

In[51]: line2, = plt.plot([3,2,1], label='b')

In[52]: line3, = plt.plot([2,2,2], label='c')


# 레전드의 작성과 아티스트로 등록

In[53]: legend_01 = plt.legend(handles=[line1], loc='upper right')     # 첫번째 레전드의 작성

In[54]: art_leng_01=plt.gca().add_artist(legend_01)                         # 첫번째 레전드의 아티스트 등록

In[55]: legend_02 = plt.legend(handles=[line2], loc='lower right')     # 첫번째 레전드의 작성

In[56]: art_leng_02=plt.gca().add_artist(legend_02)                         # 두번째 레전드의 아티스트 등록

In[57]: legend_03 = plt.legend(handles=[line3], loc='right')              # 세번째 레전드의 작성

In[58]: art_leng_03=plt.gca().add_artist(legend_03)                         # 세번째 레전드의 아티스트 등록





 

 

 

 

 참고자료

  https://matplotlib.org/tutorials/intermediate/legend_guide.html#sphx-glr-tutorials-intermediate-legend-guide-py

  https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html#matplotlib.pyplot.legend

 

 

 

 


반응형

댓글