[Python.MatPlotLib] 그래프 꾸미기 II - 범례(Legend) / X,Y축 Label, 텍스트 및 화살표 / grid / ylim/ savefig

2021. 1. 2. 05:00Python과 머신러닝/MatPlotLib 데이터 시각화

0. 지난 포스트

 

[Python.Pandas] Groupby 실습 / 데이터 분석 (Date/Time 데이터 분석)

0. 이전 글 Groupby와 관련한 기초는 이전 포스트에 정리하여, 해 포스트보다 더 기본부터 보고 싶다면 아래 글들을 읽는 것도 좋다. 2020/11/17 - [Python과 머신러닝/웹 데이터 추출] - [Python.Web] wget으로

coding-grandpa.tistory.com

 

[Python.MatPlotLib] MatPlotLib으로 그래프 그리기, 시각화, subplot/axes, figure

1. MatPlotLib .plot 함수를 사용하여 데이터 시각화하기 In [1]:%matplotlib notebook import numpy as np import matplotlib.pyplot as plt In [2]:X = range(100) Y = range(100) In [3]:fig1 = plt.figure() p..

coding-grandpa.tistory.com

 

[Python.MatPlotLib] 그래프 꾸미기 I - 색깔 / 제목 / 선형태 지정하기와 latex식 표현하기

1. 실제 데이터를 기반으로 plot 그리기 In [1]:%matplotlib notebook import numpy as np import pandas as pd import matplotlib.pyplot as plt In [2]:df = pd.read_csv("./phone_data.csv") df.head() Out[2]:..

coding-grandpa.tistory.com

 

1. 그래프 꾸미기 1 총정리 + 범례

In [1]:%matplotlib notebook 
       import numpy as np 
       import pandas as pd 
       import matplotlib.pyplot as plt

In [2]:df = pd.read_csv("./phone_data.csv") 
       df.head()
Out[2]:

Out[2]

In [3]:data_result = df[df['item']=='data'].groupby('month')['duration'].sum() 
       data_result
Out[3]:month 
       2014-11 998.441 
       2014-12 1032.870
       2015-01 1067.299
       2015-02 1067.299
       2015-03 998.441
       Name: duration, dtype: float64

In [4]:call_result = df[df['item']=='call'].groupby('month')['duration'].sum() 
       call_result
Out[4]:month
       2014-11 25547.0
       2014-12 13561.0
       2015-01 17070.0
       2015-02 14416.0
       2015-03 21727.0
       Name: duration, dtype: float64

In [5]:fig4 = plt.figure() 
       plt.plot(call_result.index, call_result, color='g', ls=':', label='call') 
       plt.plot(data_result.index, data_result, color='r', ls='-', label='data')
       plt.legend(shadow=True, fancybox=True, loc="upper left")

Out[5]

  • In[5]의 plt.plot까지는 전부 그래프 꾸미기 1에서 다룬 내용이기 때문에 넘어간다.
  • 범례를 위해서 하나 달라지는 것이 있다면, plt.plot을 수행할 때 각 plot의 label을 지정해주는 것이다.
  • label은 범례에 사용될 이름을 지정하는 parameter이다.
    • label='call'
    • label='data'
  • plt.legend() 함수를 사용하면 범례가 Out[5]와 같이 표현된다.
    1. shadow=True
      • 범례 뒤에 그림자를 그려서 입체감을 표현한다.
      • 굳이? 라는 생각이 들었다가 막상 없어보니 좀 심심하다. 기본적으로 True로 설정하는 것이 좋은 것 같다.
    2. fancybox=True
      • '범례 자동 투명화 기능'이라고 표현하는 것이 가장 적합해 보인다. 
      • MatPlotLib에도 공식적인 설명은 '데이터가 겹쳐질 경우, 자동으로 반투명으로 전환해주는 기능'이라고 정의하고 있는데, fancybox라는 parameter명은 전혀 직관적이 못해서 아쉽다.
      • 결론은, 기본적으로 True로 set 하는 것이 좋은 기능인 것 같다.
    3. loc='upper left'
      • 좌측 상단에 범례를 놓으라는 의미이고, upper/lower + left/right를 지정해서 원하는 위치에 지정할 수 있다.
      • loc='best'라고 지정할 경우 '알아서 데이터와 겹치지 않도록' 넣어주지만, 그래프의 일관성을 위해 한 곳에 지정되는 것이 좋을 것 같다.

 

2. X축 Y축 label 달기

In [7]:plt.xlabel('Month') 
       plt.ylabel('Duration')
Out[7]:Text(0, 0.5, 'Duration')

Out[7]

  • plt.xlabel을 통해 X축의 text를 지정할 수 있다.
  • plt.ylabel을 통해 Y축의 text를 지정할 수 있다.

 

3. 그래프 내에 Text 추가 및 화살표 그리기

In [8]:plt.text('2015-03',23000, 'March') 
       plt.annotate('Feb', xy=('2015-03',23000), xytext=('2015-02',17000), 
                    arrowprops=dict(facecolor='black', shrink=0.05))
Out[8]:Text(2015-02, 17000, 'Feb')

Out[8]

  • plt.text(X,Y,text) 순서로 입력하면, (X,Y) 좌표에 text가 그려진다.
  • In[8]의 plt.text('2015-03',23000,'March')는 X='2015-03', Y=23000 위치에 March를 출력하라는 의미이다.
  • plt.annotate 함수화살표를 그리는 함수이다. 각 Parameter를 차근차근 이해해보자.
  • plt.annotate('Feb', xy=('2015-03',23000), xytext=('2015-02',17000),
                    arrowprops
    =dict(facecolor='black', shrink=0.05))
    1. 'Feb'이라는 Text를 xytext=('2015-02',17000)에 그리고
    2. xytext부터 xy=('2015-03', 23000)까지 화살표를 그려라.
    3. 화살표의 특성은 facecolor='black' (검정색), 크기를 shrink=0.05만큼 줄여라

 

4. grid 그리기

In [9]:plt.grid(True, lw=0.4, ls='--')
Out[9]:

Out[9]

  • plt.grid 함수는 그래프에 x/y축 격자(혹은 눈금선)를 그려주는 함수이다.
    • True : grid를 그리라는 것이기 때문에 항상 True를 사용한다. grid를 제거하고 싶을 때 plt.grid(False)를 호출하면 된다.
    • lw=0.4 : line width의 약자로 격자의 선 굵기를 지정해줄 수 있다.
    • ls='--' : line style이다. 이전 포스트에서 정리했다시피, 격자를 점선으로 표현하라는 의미이다.

 

5. xlim / ylim

In [10]:plt.ylim(0.5,20000)
Out[10]:(0.5, 20000.0)

Out[10]

  • plt.ylim(a,b)y에 대한 상한/하한을 직접 지정해 준다. a를 하한선, b를 상한선으로 지정한다.
  • 기본적으로 MatPlotLib이 알아서 상한/하한을 지정해주지만, 이걸 따로 지정해주고 싶을 때에는 이와 같이 지정이 가능하다.
  • x에 대한 상한/하한을 지정하고 싶을 때에는 plt.xlim(a,b)를 사용할 수 있다.

 

6. 그래프 png로 저장하기

In [11]:plt.savefig('test.png')
Out[11]:

test.png

  • plt.savefig 함수를 통해서 현재까지 그려진 그래프를 외부로 저장할 수 있다.
  • 위 사진은 test.png를 그대로 붙여 넣은 사진이다. 

범례(Legend) / X,Y축 Label, 텍스트 및 화살표 / grid / ylim/ savefig

 

7. 관련 포스트

 

[Python.MatPlotLib] 그래프 꾸미기 III - 통신 데이터 분석 실습

0. 지난 포스트에 이어 지난 몇 차례의 포스트에 이어 MatPlotLib 그래프 꾸미기 실습을 진행할 예정이다. 통신 데이터를 기반으로 날짜별/통신사별 통신량을 분석하고자 한다. 우선은 데이터를 pand

coding-grandpa.tistory.com

 

[Python.MatPlotLib] Scatter Plot 실습

1. 기본 Scatter Plot 그리기 In [1]:import numpy as np import matplotlib.pyplot as plt In [2]:data = np.random.rand(512,2) data Out[2]:array([[0.90814057, 0.74740473], [0.36071483, 0.27462119], [0.11..

coding-grandpa.tistory.com

 

[Python.MatPlotLib] Histogram과 Box Plot 그리기

1. Histogram 그리기 In [1]:import numpy as np import matplotlib.pyplot as plt In [2]:x = np.random.randn(1000000) In [3]:plt.hist(x, bins=10000) Out[3]:(array([1., 0., 0., ..., 0., 0., 1.]), array([..

coding-grandpa.tistory.com

 

반응형