티스토리 뷰

Study/AI

[Python][Visualization] Legend, Annotation

생각많은 소심남 2018. 7. 5. 00:17

 사실 지난번 plot까지 하면 얼추 plot을 통해서 표현하고자 하는 내용을 전달할 수 있다. 그렇지만 이런 plot을 하는 이유는 이 plot을 보는 사람에게 조금더 정보를 효율적으로 전달하는데 의미가 있다. 이렇게 plot 자체를 효율적으로 표현하는 기법으로 legend(범례)와 Annotation(각주), Style에 대해서 잠깐 소개해본다. 
 (기본적으로 사용하는 예제 dataset은 이전 포스트와 동일하다. 

 우선 우리가 보통 범례라고 표현하는 legend는 plot내에서 표현되는 data의 label을 나타낸다. 보통 plot으로 표현되는 data는 pandas의 DataFrame이므로 그 label이라고 하면 해당 Frame의 Column name이 될 것이다. legend를 삽입하는 방법은 간단하게 pyplot내 legend()를 사용하고, 이때 legend를 어디에 출력할 건지 위치를 지정해주면 끝이다.

  1. import matplotlib.pyplot as plt
  2. import pandas as pd
  3.  
  4. file = '../stocks.csv'
  5.  
  6. stock = pd.read_csv(file, parse_dates=['Date'], index_col=['Date'])
  7.  
  8. plt.plot(stock.index, stock['AAPL'], color='red')
  9. plt.plot(stock.index, stock['MSFT'], color='blue')
  10. plt.xlabel('Date')
  11. plt.ylabel('Stock price')
  12. plt.title('Stock price in 2000')
  13.  
  14. plt.legend(loc='lower center')
  15.  
  16. plt.show()

이에 대한 결과는 다음과 같다.

참고로 legend의 인자로 들어가는 loc의 값으로는 총 9(+1)가지 값이 들어갈 수 있으며 다음과 같이 위치를 정의할 수 있다.

 물론 legend의 위치가 위처럼 겹치는 경우에는 위치를 재조정해줘야 하겠지만, 적당히 겹치지 않는 곳을 위치로 잡아주면 좋다. 그런데 위에서 9(+1)이라고 표현을 해놨는데, 이 이유는 loc 값 중 넣을 수 있는 값이 'best'라는 게 있어서다. 이 값을 선택하면 알아서 좋은곳에 legend를 붙여주기 때문에 뭔가 어디에 넣기 애매하다 싶으면 그냥 plt.legend(loc='best') 라고 해놓으면 된다. (사실 default값이 'best'이기 때문에 loc를 정의하지 않아도 legend는 잘 찍힌다.)

 그런데 앞에서 소개한 바와 같이 DataFrame의 column name을 가져와서 legend에 보여준다고 했는데, 경우에 따라서는 다른 이름으로 legend에 표현하고 싶을 수 있다. 가령 위와 같은 예시에서 AAPL이나 MSFT가 뭔지 모르는 사람한테는 legend에 'Apple', 'Microsoft' 라고 넣어주면 조금더 이해가 쉬울 것이다. 이를 위해서는 plot시 label이라는 인자에 원하는 text를 찍어주면 된다. 

  1. import matplotlib.pyplot as plt
  2. import pandas as pd
  3.  
  4. file = '../stocks.csv'
  5.  
  6. stock = pd.read_csv(file, parse_dates=['Date'], index_col=['Date'])
  7.  
  8. plt.plot(stock.index, stock['AAPL'], color='red', label='Apple')
  9. plt.plot(stock.index, stock['MSFT'], color='blue', label='Microsoft')
  10. plt.xlabel('Date')
  11. plt.ylabel('Stock price')
  12. plt.title('Stock price in 2000')
  13.  
  14. plt.legend(loc='best')
  15.  
  16. plt.show()

이러면 명확하게 2000년대의 Apple사와 Microsoft의 주식 가치 변화라는 것을 plot으로 표현할 수 있게 된다.

여기에 조금더 의미를 부여할 수 있을까? 고민을 해보면 더 표현할 수 있는게 많다. 가령 어떤 사람은 Microsoft의 주식가치가 최대일 때와 Apple의 주식가치가 최대일 때를 그래프상에서 표현할 수 있다. 또 위의 그래프에선 특정시기의 주식 가치가 얼마인지는 정확하게 알 수 없으므로, 특정지점의 주식 가치를 표현할 수 있을 것이다. 이럴 때 필요한 기능이 annotation이다.

 이 annotation을 하려면 pyplot.annotate()를 써야 하는데, 이때 필요한 정보는 그래프 상에서 표현할 위치와 해당 위치에 넣을 text, 그리고 text가 그래프상에서 놓일 위치 등이다. 추가적으로 화살표를 쓰고자 한다면 arrowprops라는 인자를 정의해 표현하기도 한다. 이전 예제에서 annotation을 넣으려면 다음과 같이 해본다.

-> 생각해보니까 내 Dataframe의 index type이 DateTimeIndex이다. 그래서 이를 plt상의 pixel index로 convert시켜주는 게 필요한데 이부분은 좀더 고민해봐야겠다..

-----------  작성중------------

댓글