소개¶
파이썬 주피터, 넘파이, 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]);
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>]
피겨.add_subplot(ncols, nrows, index)
메소드를 이용해서도 축들 객체를 만들거나 접근할 수 있다. 다음은 2행 2열 형태의 그리드 중에서 첫번째 셀에 축들을 만든다.
In [13]: ax1 = fig.add_subplot(2, 2, 1)
주어진 피겨에 모든 축들을 알아보고 싶으면 피겨.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>
fig.delaxes
메소드를 이용해서 축들을 삭제할 수 있다. 위에서 만든 첫번째 축을 삭제하고 싶으면 다음과 같이 한다.
In [23]: fig.delaxes(fig.axes[0])
피겨에 있는 모든 축들을 삭제하려면 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>]
sharex=True
, sharey=True
인자를 이용해서 모든 그림들이 같은 축을 같도록 할 수 있다. matplotlib
에 대한 더 자세한 사용법은
홈페이지를 참조한다.
다음은 pyplot.subplots
의 선택 인자들이다.
선택 인자 | 설명 |
---|---|
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]);
....: