본문 바로가기
Python/Matplotlib

레전드(legend, 범례) 처리기(handler) 기초 - matplotlib(12)

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

파이썬 버전 3.7 기준

matplotlib 버전 3.0.3 기준



  레전드(legend)처리기의 기초


본 포스팅에서는 레전드 처리기(legend handler)에 대한 내용을 간략히 다룬다.


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

import matplotlib.pyplot as plt


  레전드 처리기(legend handler)


레전드 처리기를 통해 더욱 레전드에 대한 정교한 컨트롤이 가능하다. 



  레전드 처리기의 메커니즘

레전드에 출력할 항목을 작성하기 위해, HandlerBase(링크) 서브클래스가 존재하며 여기에 핸들(handle)이 입력되어 진다. 

레전트 처리를 위한 서브클래스는 아래의 원칙에 따라 선택되어진다.

  ① handler_map 키워드 안의 값을 사용하여 get_legend_handler_map()을 업데이트 한다.

  ② 핸들이 새로 작성된 handler_map에 있는지 확인한다.

  ③ 핸들의 타입이 새로 작성된 handler_map에 있는지 확인한다.

  ④ 핸들의 mro에 있는 타입이 새로 작성된 handler_map에 있는지 확인한다.


위의 로직은 get_legend_handler()라는 함수에서 실행되어지며, 다양한 방법으로 레전드 출력 항목을 작성할 수 있는 유연성을 제공한다.


이러한 유연성을 통해 사용자는 고유의 레전드 데이터를 딕셔너리의 키(key)로 입력하고 값(value)을 사용자 지정(custom) 처리기를 입력함으로써 서로 연결시키는 것이 가능하다.


사용자 지정 처리기의 가장 단순한 예제로 직접 레전드처리를 위한 서브클래스를 사용해봄으로써 HandlerBase 서브클래스의 존재를 확인해보는 것이 있다.

단순화를 위해서 numpoints 입력인자를 사용할 수 있는 matplotlib.legend_handler.HandlerLine2D를 사용해보는 예제가 아래 있다.(numpoints에 대한 설명은 이곳(링크)에서 참고할 수 있다.)

예제를 보면 알 수 있듯이, 인스턴스를 딕셔너리 맵핑(mapping)을 통해 처리기로 전달할 수 있다.


아래 예제에서 Line A는 2개의 마커포인트를 가지게되고, Line B는 1개(기본값)의 마커포인트를 가진다.

이 코드를 실행해보았을 때, 오직 Line A 만이 레전드에 변화가 있다.

Line B를 딕셔너리를 통해 맵핑을 하면 Line B에도 마커수 및 기타 조작이 가능하다.


사용 예제)

# 레전드 서브클래스 import

In[4]: from matplotlib.legend_handler import HandlerLine2D


# plot 생성

In[5]: LineA,=plt.plot([1,2,3], marker='X', label='Line A')

In[6]: LineB,=plt.plot([3,2,1], marker='X', label='Line B')


# 입력 데이터와 레전드 처리기의 맵핑을 통한 레전드 생성

In[7]: plt.legend(handler_map={LineA: HandlerLine2D(numpoints=2)})


  레전드 내의 튜플(tuple)을 활용한 플롯 합치기

레전드 처리기를 활용한다면 두 가지 혹은 그 이상의 플롯을 합치는 기능을 이용할 수 있다.

이러한 기능을 통해 에러 바(error bar)나 히스토그램(histogram)과 같이 복잡한 플롯 형태를 작성이 가능하다.

이런 기능을 위해 기본 handler_map에 포함되어 있는 튜플(tuple) 처리기(HandlerTuple)를 사용하면 된다.

아래 예제는 두 레전드 키를 하나로 합치는 것을 설명하는 예제이다.


사용 예제)

# plot 입력변수 생성

In[8]: x=[1,2,3,4,5,6,7,8,9,10]


# plot 생성 

In[9]: bs, = plt.plot(x, 'bs', markersize=20)

In[10]: wx,= plt.plot(x[:5], 'wx', markersize=20)


# 레전드의 생성 

In[11]: plt.legend([bs, (bs, wx)],['bs', 'bs+wx'])

Out[11]: <matplotlib.legend.Legend at 0xfefeb10>


HandlerTuple 클래스는 몇몇의 래전드 키를 같은 항목에 배정하는데 사용할 수도 있다.


사용 예제)

# 레전드 서브클래스 import

In[12]: from matplotlib.legend_handler import HandlerLine2D, HandlerTuple


# plot 생성 

In[13]: plot1,=plt.plot([1,2,3],'r-o')

In[14]: plot2,=plt.plot([3,2,1],'b-x')


# 레전드의 생성 

In[15]: leg=plt.legend([(plot1, plot2)],['plot1+2'], numpoints=1, handler_map={tuple:HandlerTuple(ndivide=None)})


  사용자 지정 레전드 처리기의 구현

레전드 처리기는 사용자가 커스텀해서 사용하는 것이 가능하며 해당 부분에 대한 자세한 내용은 참고자료(링크)에 정리되어 있다.



 

 

 

 

 참고자료

  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

 

 

 

 


반응형

댓글