소개

파이썬 주피터, 넘파이, matplotlib 소개 및 기본 사용법을 익힌다.

주피터

주피터 실행

시작 > Anaconda > Jupyter Notebook를 클릭한다.

  • 적당한 폴더를 선택한다.
  • 오른쪽 위에 New를 클릭하여 Python 3 노트북을 선택하면 새로운 노트북 Untitled가 만들어진다.
  • File 메뉴 중에서 Rename을 눌러 파일 이름을 적당히 변경한다.

파이썬 명령어 실행

주피터 노트북에서 파이썬 명령들을 실행한다.

  • Shift + Enter: 커서가 있는 셀을 실행하고 새로운 셀을 만들고 커서를 이동한다.

    In [1]: 1 + 1
    Out[1]: 2
    
    In [2]: 
    
  • Ctrl + Enter: 커서가 있는 셀을 실행만한다.

    In [2]: 2 ** 3
    Out[2]: 8
    
  • 탭 자동 완성: 명령어 앞 글자만 입력하고 탭을 누르면 그 글자로 시작하는 가능한 명령어들을 보여준다.

넘파이(Numpy)

넘파이는 파이썬 라이브러리로 과학 계산을 위해 효율적인 방법들을 제공한다. 예를 들면 선형대수, 푸리에 변환, 무작위 수관련 패키지들을 제공한다. 판다스도 넘파이를 기반으로 작동한다. 넘파이는 파이썬의 리스트(list)와 비슷한 배열(array)이라는 개념을 가지고 있다.

넘파이는 다음과 같이 불러오기를 해서 사용한다.

In [3]: import numpy as np

다양한 방법으로 배열(array)를 만들 수 있다.

In [4]: np.array([1, 2, 3])
Out[4]: array([1, 2, 3])

다양한 넘파이 함수들을 이용할 수 있다.

In [5]: np.random.randn(2, 3)
Out[5]: 
array([[-0.64296226,  0.38946815, -0.25475865],
       [-0.53144495,  0.65213068, -1.54309954]])

다음과 같이 2차원 배열도 만들 수 있다.

In [6]: data = [[1, 2, 3], [4, 5, 6]]
   ...: np.array(data)
   ...: 
Out[7]: 
array([[1, 2, 3],
       [4, 5, 6]])

matplotlib

파이썬 그래프 도구인 matplotlib에 대해서 알아본다.

In [8]: import matplotlib.pyplot as plt
In [9]: plt.plot([1, 2, 3, 4, 5]);
_images/plot_simple.png

matplotlib는 피겨(Figure)와 축들(Axes)로 구성된다. 피겨는 그림이 보여지는 창(window)을 의미하고 축들은 그 창 안에 보여지는 그림을 의미한다. 축들은 반드시 하나의 피겨(창)에만 포함되어야 한다. 하나의 피겨는 여러 개의 축들을 포함할 수 있다.

일반적으로 plt.figure를 이용해 새로운 피겨 객체를 생성한다. 이 경우는 축들 객체가 생성되지 않는다.

In [10]: fig = plt.figure()

plt.figure()를 호출할 때마다 새로운 피겨 객체가 하나씩 생긴다. 만들어진 피겨 객체에 접근하기 위해서는 plt.figure(1)과 같이 만들어진 순번을 입력하면 된다. plt.figure('one')과 같이 피겨를 만들 때 이름을 설정하면 나중에 접근할 때 만들어진 순서 번호로 접근할 수도 있고 지정된 이름으로도 접근할 수 있다.

축들(Axes)

만들어진 피겨에 그림을 그리고 싶으면 축들 객체를 만들어야 한다. 축들 객체는 대부분의 플롯 함수들 plot, scatter, step, bar, stem, pie, boxplot, hist, countour 등을 가지고 있다. 축들 객체는 피겨.gca() 메소드를 이용해서 새로운 축들을 만들거나 기존의 축들을 접근할 수 있다.

In [11]: ax = fig.gca()

축들이 얻어졌으면 메소드를 이용해서 그래프를 그린다.

In [12]: ax.plot([1, 2, 3])
Out[12]: [<matplotlib.lines.Line2D at 0x15696aaaef0>]
_images/plot_simple_ax.png

피겨.add_subplot(ncols, nrows, index) 메소드를 이용해서도 축들 객체를 만들거나 접근할 수 있다. 다음은 2행 2열 형태의 그리드 중에서 첫번째 셀에 축들을 만든다.

In [13]: ax1 = fig.add_subplot(2, 2, 1)
_images/plot_overwrite_axes.png

주어진 피겨에 모든 축들을 알아보고 싶으면 피겨.axes 속성 또는 fig.get_axes() 메소드를 이용하면 피겨에 생성되어 있는 모든 축들을 리스트로 반환받는다.

In [14]: fig.axes
Out[14]: 
[<matplotlib.axes._subplots.AxesSubplot at 0x15696a81550>,
 <matplotlib.axes._subplots.AxesSubplot at 0x15696ab85c0>]

위 그림에서 보는바와 같이 같은 피겨에 여러 개의 축들을 만들면 계속 덮어쓰여 진다.

In [15]: np.random.seed(0)
   ....: ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
   ....: ax2 = fig.add_subplot(2, 2, 2)
   ....: ax2.plot([2, 0, 2])
   ....: ax3 = fig.add_subplot(2, 2, 3)
   ....: ax3.plot([0, 2, 0])
   ....: ax4 = fig.add_subplot(2, 2, 4)
   ....: ax4.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))
   ....: 
Out[16]: 
(array([ 1.,  0.,  1.,  4.,  3.,  4.,  7.,  6.,  7., 10.,  7., 11., 11.,
         5.,  6.,  5.,  5.,  2.,  3.,  2.]),
 array([-2.55298982, -2.31185259, -2.07071537, -1.82957815, -1.58844093,
        -1.34730371, -1.10616648, -0.86502926, -0.62389204, -0.38275482,
        -0.1416176 ,  0.09951963,  0.34065685,  0.58179407,  0.82293129,
         1.06406851,  1.30520574,  1.54634296,  1.78748018,  2.0286174 ,
         2.26975462]),
 <a list of 20 Patch objects>)
Out[18]: [<matplotlib.lines.Line2D at 0x15696cb7b00>]
Out[20]: [<matplotlib.lines.Line2D at 0x15696ce7320>]
Out[22]: <matplotlib.collections.PathCollection at 0x15696d12dd8>
_images/plot_ax1_3.png

fig.delaxes 메소드를 이용해서 축들을 삭제할 수 있다. 위에서 만든 첫번째 축을 삭제하고 싶으면 다음과 같이 한다.

In [23]: fig.delaxes(fig.axes[0])
_images/plot_del_axes0.png

피겨에 있는 모든 축들을 삭제하려면 fig.clear() 메소드를 사용한다.

In [24]: fig.clear()

fig.add_subplot과 같은 것으로 plt.subplot 함수를 사용해도 된다.

plt.subplots 함수를 이용하면 여러 개의 축들을 한꺼번에 갖는 새로운 피겨를 얻을 수 있다. 다음은 2행 3열의 축들을 갖는 새로운 피겨 객체를 반환한다.

In [25]: fig, axes = plt.subplots(2, 3)
   ....: axes
   ....: 
Out[26]: 
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000015696D6F9E8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000015696DB9C50>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000015696DEA320>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000015696E119B0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000015696E430B8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000015696E68710>]],
      dtype=object)

다음과 같이 axes 배열을 이용해서 각각의 그림을 그릴 수 있다. 첫째 행, 둘째 열에 그림을 그린다.

In [27]: axes[0, 1].plot(np.random.randn(30))
Out[27]: [<matplotlib.lines.Line2D at 0x15696e9c630>]
_images/plot_subplots.png

sharex=True, sharey=True 인자를 이용해서 모든 그림들이 같은 축을 같도록 할 수 있다. matplotlib에 대한 더 자세한 사용법은 홈페이지를 참조한다.

다음은 pyplot.subplots의 선택 인자들이다.

pyplot.subplot의 선택 인자들
선택 인자 설명
nrows 축들의 행의 갯수
ncols 축들의 열의 갯수
sharex 모든 축들이 같은 x축 틱(tick)을 사용한다.
sharey 모든 축들이 같은 y축 틱(tick)을 사용한다.
subplot_kw 모든 축들에 공통으로 지정될 add_subplot 메소드에 입력될 사전형 키워드
**fig_kw 그 밖의 키워드들 예: plt.subplots(2, 2, figsize=(8, 6))

한글 표시

윈도우 운영체제에서 한글을 그림에 표시하려면 다음과 같이 설정을 해야한다.

In [28]: from matplotlib import font_manager, rc
   ....: font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
   ....: rc('font', family=font_name)
   ....: 
   ....: fig = plt.figure();
   ....: ax = fig.add_subplot(111);
   ....: ax.set_xticks([0, 1, 2, 3, 4]);
   ....: ax.set_xticklabels(['하나', '둘', '셋', '넷', '다섯'], rotation=30, fontsize='small');
   ....: ax.plot([0, 250, 500, 750, 1000]);
   ....: 
_images/plot_simple_ko.png