[9/7] (2) matplotlib 기초

박정훈·2021년 9월 8일
0

수업 일지

목록 보기
3/4

참고

  • 프로그래밍 수업 내용 정리와 복습, 기초적인 딥러닝 정보 저장을 위해 작성합니다
  • 고등학교 수학 정도의 지식을 가지고 있는 학생이 주된 대상입니다
  • Python에 대해서는 기본적인 내용(자료형, 제어문, 함수, 클래스)에 대한 학습을 마친 상태입니다

수업 환경

  • MacOS (학생) / Ubuntu 20.04 (선생님)
  • python 3.8
  • anaconda 4.10.3

Matplitlib 설치

matplotlib은 그래프 등을 그릴 때 자주 사용하는 라이브러리입니다. 다양한 그리기 기능을 지원합니다.

terminal을 켜고, 아래 명령어를 실행합니다

pip install matplotlib

설치 완료 후, python 파일에 가서 아래를 실행했을 때 오류가 나지 않으면 성공!

from matplotlib import pyplot as plt

matplotlib중 특히 pyplot이라는 모듈을 plt라는 별칭으로 가져오겠다는 의미입니다. 아래와 동일합니다.

import matplotlib.pyplot as plt

그리기

기초

바로 코드를 봐보죠! 어렵지 않습니다.

from matplotlib import pyplot as plt

plt.plot([1, 2, 3], [4, 7, 6])
plt.show()

실행하면 창이 뜨시나요? 그래프가 보이면 정상입니다. 첫 리스트는 x축의 좌표들, 두 번째 리스트는 y축의 좌표들이고, plt.plot()함수는 주어진 점들을 직선으로 이어줍니다.

함수 그리기 without numpy

직선은 방금 그렸습니다. 그럼 곡선 함수는 어떻게 그릴까요? x간격을 매우 잘게 쪼개서 각 구간을 직선으로 이어주면 됩니다.
아래 예시에서 이차함수 y = x(x - 1)을 그려보았습니다.

def f(x):
	return x * (x - 1)

x_range = [i / 20 for i in range(-100, 100)]
y_range = [f(x) for x in x_range]
plt.plot(x_range, y_range)
plt.show()

x, y_range를 만들 때 list 안에 for문이 들어가있죠? 이런 문법을 list comprehension이라고 부릅니다. 직관적으로 이해하면 크게 어렵지 않습니다.
i라는 변수가 range(-100, 100)을 돌 때, i / 20이라는 값을 취해서 list로 만들겠다!라는 것이죠 아래 코드와 동일합니다.

def get_range():
	tmp = list()
    for i in range(-100, 100):
    	tmp.append(i / 20)
    return tmp
x_range = get_range()

comprehension을 이용하는 것이 훨씬 깔끔하죠? 자주 이용하게 될 겁니다.

함수 그리기 with numpy

list comprehension을 이용하지 않고, numpy의 broad casting을 이용하면 더 간단하게 함수를 그릴 수 있습니다. x 구간을 잘게 쪼갠다는 원리는 동일합니다.

from matplotlib import pyplot as plt
import numpy as np

def f(x_arr):
	y_arr = x_arr * (x_arr - 1)  # broad cast. 스칼라와의 연산을 shape에 자동으로 맞춰서!
    return y_arr
    
xrange = np.arange(-5, 5, 0.05)
yrange = f(xrange)
plt.plot(xrange, yrange)
plt.show()

np.arange 함수는 python 자체 range와는 다르게, step에 실수도 넣을 수 있어, 더 조밀한 range를 만들 수 있습니다.

함수 정리

이제까지 배운 것들을 적용해서, 다양한 함수를 그려볼 수 있습니다!

from matplotlib import pyplot as plt
import numpy as np

xrange = np.arange(-5, 5, 0.05)
yrange1 = xrange * (xrange - 1)  # 이렇게 줄여도 무방
yrange2 = np.abs(xrange)  # 절댓값 함수
yrange3 = np.sin(xrange)  # sin 함수

plt.plot(xrange, yrange1)
plt.plot(xrange, yrange2)
plt.plot(xrange, yrange3)
plt.show()

Reference

profile
배우는 중입니다

0개의 댓글