2022년 2월 3일(목)부터 4일(금)까지 네이버 부스트캠프(boostcamp) AI Tech 강의를 들으면서 개인적으로 중요하다고 생각되거나 짚고 넘어가야 할 핵심 내용들만 간단하게 메모한 내용입니다. 틀리거나 설명이 부족한 내용이 있을 수 있으며, 이는 학습을 진행하면서 꾸준히 내용을 수정하거나 추가해 나갈 예정입니다.
Python과 Matplotlib
Matplotlib
Matplotlib란?
Matplotlib
은 Python에서 사용할 수 있는 시각화 라이브러리
- 현재 사용되고 있는 다양한 데이터 분석 및 머신러닝/딥러닝은 Python에서 이뤄지고 있다.
numpy
와 scipy
를 베이스로 하여 다양한 라이브러리와 호환성이 좋다.
Scikit-Learn
, PyTorch
, Tensorflow
Pandas
- JavaScript의 D3는 점, 선, 면을 하나하나 일일이 구현해야 한다.
Matplotlib
은 다양한 시각화 방법론을 제공한다.
- 그 외에도
Seaborn
, Plotly
, Bokeh
, Altair
등의 시각화 라이브러리가 존재
- Matplotlib가 범용성이 제일 넓고, base가 되는 라이브러리
Matplotlib 사용하기
matplotlib
은 줄여서 mpl
로 코드 상에서 사용합니다.
import matplotlib as mpl
matplotlib
에서 가장 많이 사용되는 모듈은 pyplot
이다.
Figure와 Axes
matplotlib
에서 그리는 시각화는 Figure라는 큰 틀에 Ax라는 서브플롯을 추가해서 만든다.
fig = plt.figure()
plt.show() # fig에 나타난 그래프를 그려라. (ipython, colab 등에서는 show 없이도 결과 출력한다.)
Ipython(Jupyter Notebook 등)에는 Magic Command가 내장되어 있는데, %matplotlib inline
을 사용하면 pyplot의 show() 함수 없이도 바로 그래프로 표현할 수 있다.
add_subplot()
을 통해 fig
에 서브플롯을 추가할 수 있다.
fig = plt.figure()
ax = fig.add_subplot()
plt.show()
그래프의 사이즈를 조정하려면 figure 함수에 figsize를 파라미터로 전달하여 조정한다.
fig = plt.figure(figsize=(12, 7)) # 12 : 7인 figure를 그려라.
fig.set_facecolor('black')
ax = fig.add_subplot()
plt.show()
큰 틀에서 그래프를 두 개 이상 그리고 싶으면 위치를 지정해야 한다.
fig = plt.figure()
ax = fig.add_subplot(121)
# Figure 틀을 가로로 한 개, 세로로 2개로 나누었을 때, 첫 번째 틀에 그래프를 추가해 달라.
# One based index임을 유의한다.
# 가독성을 높이려면 ax = fig.add_subplot(1, 2, 1)로 사용할 수 있다.
ax = fig.add_subplot(122)
plt.show()
plot으로 선 그래프 그리기
fig = plt.figure()
ax = fig.add_subplot()
x = [1, 2, 3]
plt.plot(x)
plt.show()
# (0, 1), (1, 2), (2, 3)을 지나는 직선으로 이루어진 그래프를 그린다.
서브플롯 객체 ax에 그리기
프로그래밍 스타일에 따라 순차적으로 그래프를 그리지 않을 수도 있는데, 이는 ax
에 직접 그래프를 그리면 된다.
- Pyplot API : 순차적 방법
- 객체지향(Object-Oriented) API : 그래프에서 각 객체에 대해 직접적으로 수정하는 방법
fig = plt.figure()
x1 = [1, 2, 3]
x2 = [3, 2, 1]
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
ax1.plot(x1)
ax2.plot(x2)
plt.show()
plt로 그리다 plt.gcf().get_axes()로 다시 서브플롯 객체를 받아서 사용할 수도 있다.
Plot의 요소
ax에 동시에 다양한 그래프를 그릴 수 있는데, 이때 같은 종류의 여러 그래프는 색상이 자동적으로 구분된다.
fig = plt.figure()
ax = fig.add_subplot(111)
# 3개의 그래프 동시에 그리기
ax.plot([1, 1, 1]) # 파랑
ax.plot([1, 2, 3]) # 주황
ax.plot([3, 3, 3]) # 초록
plt.show()
하지만 다른 종류의 그래프는 색상이 자동으로 구분되지는 않는다.
fig = plt.figure()
ax = fig.add_subplot(111)
# 선그래프와 막대그래프 동시에 그리기
ax.plot([1, 2, 3], [1, 2, 3])
ax.bar([1, 2, 3], [1, 2, 3])
plt.show()
그래서 지정할 색을 직접 명시해주는 게 좋다.
색상 지정
일반적으로 color
파라미터를 통해 전달한다.
fig = plt.figure()
ax = fig.add_subplot(111)
# 3개의 그래프 동시에 그리기
ax.plot([1, 1, 1], color='r') # 한 글자로 정하는 색상
ax.plot([2, 2, 2], color='forestgreen') # color name
ax.plot([3, 3, 3], color='#000000') # Hex Code (BLACK)
plt.show()
텍스트 사용
label(레이블) 추가
범례(legend) 추가하여 레이블 보이기
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 1, 1], label='1')
ax.plot([2, 2, 2], label='2')
ax.plot([3, 3, 3], label='3')
ax.legend()
plt.show()
title(타이틀) 추가
그래프의 타이틀 추가하기
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 1, 1], label='1')
ax.plot([2, 2, 2], label='2')
ax.plot([3, 3, 3], label='3')
ax.set_title('Basic Plot')
ax.legend()
plt.show()
suptitle()
로 fig에도 타이틀 추가하기
fig = plt.figure()
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
ax1.set_title('ax1')
ax2.set_title('ax2')
fig.suptitle('fig')
plt.show()
ax에서 특정 데이터를 변경하는 경우 .set_{}()
형태의 메서드가 많고, set
으로 세팅하는 정보를 받아오는 경우에는 .get_{}()
형태의 메서드를 사용한다.
축 정보 추가
ticks()
로 축에 적히는 수의 위치를 지정한다.
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 1, 1], label='1')
ax.plot([2, 2, 2], label='2')
ax.plot([3, 3, 3], label='3')
ax.set_title('Basic Plot')
ax.set_xticks([0, 1, 2])
ax.legend()
plt.show()
ticklabels()
는 축에 적히는 텍스트를 수정한다.
ax.set_xticklabels(['zero', 'one', 'two'])
일반적인 텍스트 추가
text()
로 원하는 곳에 텍스트를 적어주기
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 1, 1], label='1')
ax.plot([2, 2, 2], label='2')
ax.plot([3, 3, 3], label='3')
ax.set_title('Basic Plot')
ax.set_xticks([0, 1, 2])
ax.set_xticklabels(['zero', 'one', 'two'])
ax.text(x=1, y=2, s='This is Text')
ax.legend()
plt.show()
annotate()
를 통해 원하는 포인트를 지정하고 텍스트 추가
ax.annotate(text='This is Annotate', xy=(1, 2))
annotate
는 화살표 등을 추가 가능
ax.annotate(text='This is Annotate', xy=(1, 2),
xytext=(1.2, 2.2),
arrowprops=dict(facecolor='black'),
)
각 텍스트 요소의 alignment(정렬)도 바꿀 수 있다.