본문 바로가기

Python

Matplotlib을 이용해 그래프 그리기

320x100
320x100

 

 

 Python의 matplotlib을 이용해 sine 함수 그래프를 그리는 방법에 대한 정리 글이다. 코드 몇 줄이면 뚝딱 뚝딱 할 수 있는 작업이지만 처음 하는 사람에게는 X축 설정에서 헷갈릴 부분들이 있어 그 부분을 중심으로 정리하고자 한다.

import numpy as np
import matplotlib.pyplot as plt

fs = 100
time = np.arange(-5, 5, 1 / fs)
signal = np.sin(time)

plt.figure(1)
plt.plot(time, signal)
plt.show()
  • [Line 4]
    fs는 sampling rate을 의미한다. 전자 장비를 사용하여 다루는 신호는 무조건 digital signal 즉 discrete signal이다. 자연에서 발생된 analog signal를 전자 장비로 측정하면 digital signal이 되는데 이때 fs를 얼마나 높게 잡느냐에 따라 빼곡함이 달라진다.
  • [Line 5]
    np.arange( start, end, step )은 start에서 시작해 step 간격으로 end까지 변수를 생성하는 함수이다. 따라서 time 변수에는 -5 ~ 5 사이의 값이 1 / 100 간격으로 생성되어 저장된다.
  • [Line 6]
    sine 함수 그래프를 그리기 위해선 X에 따른 Y 값을 sine 값으로 설정해야 한다. np.sin( )에 time을 넣으면 input 값에 따른 sine 값을 반환해준다. 결과적으로 signal 변수에는 -5 ~ 5 사이에 대응되는 sine 값이 저장된다.
  • [Line 8]
    sine 함수 그래프가 그려질 도화지(?)를 먼저 만들어줘야하는데 이는 plt.figure( )를 사용하면 된다. 여기서 숫자 1은 figure의 index에 해당한다. plt.figure(1), plt.figure(2) 처럼 여러개의 도화지를 동시에 만들어 각각에 다른 그래프를 그려줄 수 있다. 
  • [Line 9,10]
    plt.plot( time, signal )을 통해 그래프를 그려준 후 plt.show( )로 그래프가 그려진 figure(= 도화지)를 출력해주면 된다. 이때 sine 함수 그래프는 [ [ time[0], signal[0] ], [ time[1], signal[1] ], [ time[2], signal[2] ], ... ]으로 쌍을 이뤄 그려지게 된다. 같은 index로부터 time 값과 signal 값을 가져와 한 쌍으로 묶어 그래프로 그려주는 흐름이다.
idx 0 1 2 3 4 5 6
time[idx] -5 -4.99 -4.98 -4.97 -4.96 -4.95 -4.94
signal[idx] 0.9589 0.9617 0.9644 0.9670 0.9695 0.9719 0.9742

 

 

 


 

 

 plt.plot( )에 대해 더 알아보자. 위에서는 plt.plot(time, signal)와 같이 x축과 y축 변수를 따로 지정해줬는데 아래 코드처럼 plt.plot(signal)으로 y축에 해당하는 값만을 지정해주면 어떻게 그려질까?

plt.figure(2)
plt.plot(signal)
plt.show()

 

 

 그래프 형태는 같지만 x축의 범위가 다르게 형성되는 것을 확인할 수 있다. x축이 0 ~ 999로 잡히는데 이유는 signal의 크기가 1000이기 때문이다. x축에 해당되는 데이터가 입력되지 않아 plt.plot( ) 함수가 자동으로 signal 크기에 맞춰 0부터 1씩 증가하는 변수 1000개를 만들어 x축으로 사용한 것이다. 쉽게 말하면 위의 표에서 idx를 x축으로 사용한 것이다.

idx 0 1 2 3 4 5 6
signal[idx] 0.9589 0.9617 0.9644 0.9670 0.9695 0.9719 0.9742

 

 

 


이 타이밍에..

잠깐 광고보고 옵시다ㅎㅎ

728x90
728x90

 


 

 

 이번에는 x축에 사용될 변수 time2를 새로 생성해서 그리면 어떻게 되는지 확인해 보자. 이때 time2의 크기는 signal의 크기 1000와 같게 만들어줘야 에러 없이 plt.plot( )을 해줄 수 있다.

time2 = np.arange(0, 10, 1 / fs)

plt.figure(3)
plt.plot(time2, signal)
plt.show()​

 

 x축 변수로 0에서 10까지 1 / fs의 간격으로 생성된 변수 time2을 사용했기 때문에 그래프의 형태는 똑같지만 x축의 범위가 0 ~ 9.99로 다르게 잡힌 그래프가 그려지는 걸 확인할 수 있다. 이 예제에서 핵심은 y값으로 사용될 변수와 크기만 갖다면 얼마든지 그래프의 x축 범위를 변경해줄 수 있다는 점이다. (더 정확히는 x축 변수에는 일정한 간격의 오름차순으로 생성된다는 조건이 붙긴한다)

 

 애초에 우리는 첫 그래프에서는 -5 ~ 5 사이의 변수인 time을 통해 signal을 얻었다. 따라서 plt.plot(time, signal)을 해줘야 x와 y가 우리가 예상하는대로 제대로 매칭되는 그래프를 얻을 수 있다. 하지만 plt.plot( )은 설정에 따라 변형된 그래프를 그릴 수 있다. 그래프의 형태는 (time, signal)의 형태를 유지하지만 x축의 범위를 변경하고 싶은 경우, x값으로 들어가는 변수를 다르게 넣어주기만 한다면 우리는 원하는 형태의 그래프를 얻을 수 있게 된다.

 

 

 


 

 

 plt.plot( )은 매개변수 x와 y에 들어가는 변수의 크기만 같다면 얼마든지 그래프를 그려낼 수 있다. 극단적인 예를 들어 나타내보자.

size = 100
x = np.random.rand(100) * 100 # 0 ~ 100사이의 값 100개를 랜덤하게 생성
y = np.random.rand(100) * 10  # 0 ~ 10사이의 값 100개를 랜덤하게 생성

plt.figure(4)
plt.plot(x, y)
plt.show()​

 

 x, y의 범위는 다를지라도 개수가 100개로 같기 때문에 plt.plot( )으로 그래프를 그리는 것엔 아무런 문제가 없다. 그리고 랜덤하게 생성된 변수 x, y를 그린 것이라 그래프 자체에 의미는 없지만 에러없이 잘 그려지는 것을 확인할 수 있다.

 

 

 


 

 

 지금까지 matplotlib.pyplot의 plot( )함수를 사용하는 방식에 대해 알아보았다. 나도 독학을 통해 깨달은 것을 풀어낸 것이라 틀린 설명이 존재할 수 있으니.. 댓글로 남겨주시면 감사하겠습니다.