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 |
이 타이밍에..
잠깐 광고보고 옵시다ㅎㅎ
이번에는 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( )함수를 사용하는 방식에 대해 알아보았다. 나도 독학을 통해 깨달은 것을 풀어낸 것이라 틀린 설명이 존재할 수 있으니.. 댓글로 남겨주시면 감사하겠습니다.
'Python' 카테고리의 다른 글
NIA AIHub 원격 서버 환경 구축 (0) | 2021.11.30 |
---|---|
Python Multiprocessing 작업하며 발생한 이슈들 정리 (3) | 2021.11.04 |
Python으로 신호 푸리에 변환하는 방법 (4) | 2021.08.31 |
Python으로 DICOM 파일 다루는 방법 (11) | 2021.08.31 |
Python의 fileinput module로 파일 수정하는 방법 (1) | 2021.08.31 |