코린이의 소소한 공부노트

matplotlib을 이용한 시각화 기초 (1) 그래프 본문

Deep Learning

matplotlib을 이용한 시각화 기초 (1) 그래프

무지맘 2021. 8. 21. 21:50

넘파이를 이용한 코딩을 하다 보면 숫자들을 많이 다루기 때문에 한 번씩 헷갈린다. 그래서 내가 다루고 있는 자료들을 그래프로 확인해볼 일이 종종 생긴다.
이번 글에서 볼 것은 matplotlib를 이용한 그래프 시각화이다.
일단 필요한 모듈을 불러오는 것부터 시작해보자.

import numpy as np
import matplotlib.pyplot as plt # 이미지를 띄울 수 있게 해주는 모듈
%matplotlib inline
# 주피터 내부에 이미지를 띄울 수 있게 해주는 작업

그래프 그려보기


data라는 배열을 이용해서 여러 그래프를 그려보려고 한다. 필자는 randn을 썼지만, 다른 랜덤함수를 써도 상관없다.

data = np.random.randn(50) # 무작위로 50개의 수 생성
data
>>
array([ 1.25656064,  1.17320314, -0.67950408,  0.07639215, -0.47256601,
        0.03979355, -0.84851251,  2.60795872,  0.38637734, -0.76972805,
        0.13442937,  0.53914271, -2.90798161, -0.45689221,  0.11725868,
        1.25013832,  0.31701518, -0.79468488,  0.66047628, -0.43902571,
        1.16507865,  0.28394999, -0.7014996 ,  0.63346066, -1.04333641,
       -0.44162423, -0.07980786, -1.3185637 , -1.31754754,  0.22676844,
        0.97204498, -0.60997698, -0.78342006, -0.84285173, -0.97536029,
        1.83356673, -1.39830764,  0.34930518,  0.88364159,  0.33435219,
        0.81088778,  1.60075596, -1.15835273, -0.66283391,  0.17626617,
        1.58868855,  0.7776454 ,  0.3611629 ,  1.18173834,  0.56510512])

 

첫 번째로 볼 것은 plot 함수이다. 첫 번째 원소부터 차례대로 얼마인지 그래프로 표시해준다. 코드를 실행하면 그래프가 나온다.

plt.plot(data)
# plt.show()   # 원래 그래프를 시각화하려면 이 함수가 필요하지만
               # 모듈 임포트때 해둔 inline때문에 show가 없어도 시각화 가능!
>>
[<matplotlib.lines.Line2D at 0x1def2c36d00>] # show를 쓰면 이 output은 출력X

[그림 014] plot의 결과

 

두 번째로 볼 것은 hist 함수이다. 가로축은 데이터(여기서는 배열의 각 원소)의 값, 세로축은 도수(빈도수)이다.

plt.hist(data)
# TMI: data는 randn으로 난수를 만든것이기 때문에
# 히스토그램으로 나타내면 표준정규분포 그래프가 보임
>>
(array([ 1.,  0.,  3.,  8.,  8., 13.,  7.,  6.,  3.,  1.]), # 도수
 array([-2.90798161, -2.35638758, -1.80479354, -1.25319951, -0.70160548,
        -0.15001145,  0.40158259,  0.95317662,  1.50477065,  2.05636468,
         2.60795872]), # 가로축의 구간값
 <BarContainer object of 10 artists>) # show를 쓰면 이 output은 출력X

[그림 015] hist의 결과

 

subplot을 이용해 그래프를 한번에 여러 개를 그릴 수도 있다.

# 3행 2열 그래프
plt.subplot(3,2,1) # 1번: 1행 1열 (matplot은 0번째가 없음)
plt.subplot(3,2,2) # 2번: 1행 2열
plt.subplot(3,2,3) # 3번: 2행 1열
plt.subplot(3,2,4) # 4번: 2행 2열
plt.subplot(3,2,5) # 5번: 3행 1열
plt.subplot(3,2,6) # 6번: 3행 2열
>>
<AxesSubplot:>

[그림 016] 그래프의 위치만 정했을 뿐, 어떤 그래프를 그릴지 정하지 않아 빈 상태로 만들어졌다.

대충 그리는 방법을 알았으니, 이제 여러 가지 옵션들을 확인해보자.


그래프의 옵션


첫 번째로 볼 것은 그래프 선의 옵션이다.

색상 b(파랑) g(초록) r(빨강) c(청록) y(노랑) k(검정) w(하양)  
마커 -(선) --(점선) o(원) v(역삼각) ^(삼각형) s(네모) +(플러스) .(점)

위에서 만든 3행 2열 subplot에 하나씩 그려보겠다.

plt.subplot(3,2,1)
plt.plot(data, 'b-') # 파란색 선. - 없이 'b'만 써도 됨.

plt.subplot(3,2,2)
plt.plot(data, 'g--') # 초록색 점선

plt.subplot(3,2,3)
plt.plot(data, 'ro') # 빨간색 원

plt.subplot(3,2,4)
plt.plot(data, 'cv') # 청록색 역삼각형

plt.subplot(3,2,5)
plt.plot(data, 'y^') # 노란색 삼각형

plt.subplot(3,2,6)
plt.plot(data, 'ks') # 검정색 네모
>>
[<matplotlib.lines.Line2D at 0x1def308b850>]

[그림 017] 그래프의 여러가지 색상과 마커

 

두 번째로 볼 것은 그래프의 종류이다. 위에서 대충 살펴봤지만 많이 쓰이는 3가지만 살펴보겠다.

# 1. 플롯
# x축: data의 개수. 0부터 시작한다.
# y축: data의 값
plt.subplot(1,3,1)
plt.plot(data, 'r') # 빨간색 선

# 2. 히스토그램
# plot과 다르게 색깔 이름을 color로 지정해줘야한다.
plt.subplot(1,3,2)
plt.hist(data, color='g', bins=20) #bins=가로축 구간의 개수. bins가 클수록 막대의 폭이 좁다.

# 3. 스캐터
# (x좌표, y좌표) 점 찍기
plt.subplot(1,3,3)
plt.scatter(np.arange(20), np.arange(20)) # x좌표: 0, 1, ..., 19 / y좌표: 0, 1, ..., 19
>>
<matplotlib.collections.PathCollection at 0x1def4b71ac0>

[그림 018] plot / hist / scatter

 

세 번째로 볼 것은 그래프 사이즈 조절이다. figure 함수 안에 인자 figsize를 이용하여 가로, 세로의 길이를 inch 단위로 조절이 가능하다. 사이즈는 튜플로 입력해주면 된다.

plt.figure(figsize=(10,5)) # 단위: 인치
plt.plot(data, 'k+') # 검정색 +
# 여러 개의 그래프를 그릴 때 알고 있어야 하는 사항
# 1. figure가 맨 위에 있어야 그 아래에 있는 그래프에 모두 사이즈가 적용된다.
# 2. 그래프 하나의 사이즈가 너무 크면 비율이 조정된다.
>>
[<matplotlib.lines.Line2D at 0x1def311c820>]

[그림 021] 그래프 사이즈 조절. 다른 그래프 이미지보다 좀 더 크게 나온 것을 확인할 수 있다.

 

네 번째로 볼 것은 선 스타일과 범례이다. 지금까지 그래프를 그린 것을 보면 한 그래프씩 따로 그렸는데, plot을 여러 번 써서 겹쳐 그릴 수도 있다. 이때 헷갈림을 방지하기 위해 (색상을 달리 할 수도 있지만) drawstyle을 이용해 선 스타일을 다르게 쓰기도 한다. 이때 legend를 이용해 범례도 함께 나타내주면 좋다.

plt.plot(data, 'k--', label='Default')
plt.plot(data, 'b', drawstyle='steps-post', label='steps') # 계단식
plt.legend()
>>
<matplotlib.legend.Legend at 0x1def2f19e50>

[그림 019] 같은 데이터를 선 스타일을 바꿔 2가지를 겹쳐 그려보았다.

 

다섯 번째로 볼 것은 이름 달기이다. 그래프의 제목도 달 수 있고, x축, y축에도 이름을 달 수 있다.

plt.plot(data)
plt.title('Random Graph') # 그래프 제목
plt.xlabel('Stages') # x축 이름
plt.ylabel('Values') # y축 이름
>>
Text(0, 0.5, 'Values')

[그림 020] 그래프 이름 달기


미세먼지팁) 그래프를 그리고 나면, 직접 그래프를 드래그&드랍을 해서 이미지를 저장할 수 있고, 내가 그린 그래프 코드 다음에 plt.savefig('파일이름.확장자')을 이용해 저장도 할 수 있다.

'Deep Learning' 카테고리의 다른 글

matplotlib을 이용한 시각화 기초 (2) 이미지  (0) 2021.10.26
Numpy 기초 다지기  (0) 2021.08.18
Tensor 이해하기  (0) 2021.08.08