일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 한강
- 러닝
- Python
- Shell
- Podman
- zabbix
- 뚝섬유원지
- 중식
- 오답노트
- 달리기
- 소모임
- 대구
- 자전거
- Grafana
- 유산소
- Kubernetes
- 정보처리기사
- DSEC
- 10km
- Run The Bridge
- 하체
- 맛집
- 2021
- 성수대교
- 힐링
- 건대입구역
- Linux
- docker
- 대전
- GitHub
- Today
- Total
Run The Bridge
Chapter3 그래프그리기 본문
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 모듈 import numpy as np import matplotlib.pyplot as plt %matplotlib inline # data np.random.seed(1) # 난수를 1로 고정 x = np.arange(10) y = np.random.rand(10) # 그래프 표시 plt.plot(x, y) # 꺾은선 그래프 plt.show() # 그래프 그리기 | cs |
결과:
Pycharm에서 사용할 때는 %matplotlib inline을 빼주어야 한다.
※ 지금까지의 이력을 메모리에 삭제하는 명령: %reset
3차 함수 f(x) = (x-2)x(x+2) 그리기
1 2 3 4 5 6 7 8 | # 모듈 import numpy as np import matplotlib.pyplot as plt %matplotlib inline def f(x): return (x-2) * x * (x+2) print(f(1)) | cs |
f(1) = -3 # x(x2-4)
x는 ndarray배열이며 각각에 대응한 f를 한꺼번에 ndarray로 돌려준다.
벡터의 사칙연산은 각 요소마다 이루어지는 성질이 있기에 매우 편리하다
1 | print(f(np.array([1, 2, 3]))) | cs |
f(np.array([1, 2, 3])) = [-3 0 15]
1 2 | x = np.arange(-3, 3.5, 0.5) # x의 범위를 -3 ~ 3까지로 제한 print(x) | cs |
x = [-3. -2.5 -2. -1.5 -1. -0.5 0. 0.5 1. 1.5 2. 2.5 3. ]
그래프의 x를 정의하는 경우 arange보다 linspace라는 명령이 사용하기 쉬울수 있다.
linspace(n1, n2, n)하면 범위 n1에서 n2사이를 일정 간격 n개의 구간으로 나눈 값을 돌려준다.
1 2 | x = np.linspace(-3, 3, 10) # linspace(n1, n2, n), n1에서 n2사이를 일정 간격 n개의 구간으로 나눈 값을 return한다. print(np.round(x, 2)) | cs |
x = [-3. -2.33 -1.67 -1. -0.33 0.33 1. 1.67 2.33 3. ] # 모든 수는 가장 가까운 수들과 0.66 ~ 0.67씩의 차이를 가진다.
1 2 | plt.plot(x, f(x)) plt.show() | cs |
로 출력해보면 다음과 같은 모양이나온다.
But, x = -2, 0 ,2일 때 f(x)가 0의 값을 갖는지 여부를 알기 어렵다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def f2(x, w): return (x-w) * x * (x + 2) # 함수정의 # x를 정의 x = np.linspace(-3, 3, 100) # x를 100분할하기 # 차트 묘사 plt.plot(x, f2(x, 2), color='black', label='$w=2$') plt.plot(x, f2(x, 1), color='cornflowerblue', label='$w=1$') plt.legend(loc="upper left") # 범례표시, label표시부분 plt.ylim(-15, 15) # y축의 범위 plt.title('$f_2(x)$') # 제목 plt.xlabel('$x$') # x 라벨 plt.ylabel('$y$') # y 라벨 plt.grid(True) # 그리드, 뒤에 바둑무늬 plt.show() | cs |
그래프가 매끄러워지고, 그리드와 라벨, 제목, 범례가 들어갔습니다.
x(x2-4)함수가 x축과 만나는 점은 -2, 0, 2라는 것이 명확해졋습니다.
검정: -2, 0, 2
파랑: -2,0, 1
사용할 수 있는 색상목록 리스트 확인
1 2 | import matplotlib matplotlib.colors.cnames | cs |
그래프를 여러 개 보여주기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def f2(x, w): return (x-w) * x * (x + 2) # 함수정의 # x를 정의 x = np.linspace(-3, 3, 100) # x를 100분할하기 plt.figure(figsize=(10, 3)) # figure 지정 plt.subplots_adjust(wspace=0.5, hspace=0.5) # 그래프의 간격을 지정, 액자 크기지정 작으면 늘려주자 for i in range(6): plt.subplot(2, 3, i + 1) # 그래프 묘사의 위치를 지정 plt.title(i + 1) plt.plot(x, f2(x, i), 'k') plt.ylim(-20, 20) plt.grid(True) plt.show() | cs |
여러 그래프를 나란히 표시하려면 plt.subplot(n1, n2, n)를 사용한다.
전체를 세로 n1, 가로 n2로 나눈 n번째에 그래프가 그려진다.
plt.subplot(2, 3, i + 1) # 그래프 묘사의 위치를 지정
--> 2 x 3행의 i + 1(1)번째 위치를 가리키고, 1씩 증가하면서 오른쪽으로 위치를 옮긴다.
plt.figure(figsize=(w, h)) = 전체 영역의 크기를 지정한다.
가로길이 = w, 세로길이 = h
subplot으로 늘어놓을 때, 좌우 및 상하 간격은 plt.subplots_adjust(wspace=w, hspace=h)로 조절이 가능하다.
좌우간격 = w, 상하간격 = h
plt.subplot의 n은 0이 아닌 1부터 시작한다.
3차원 그래프 그리기
f(x0, x1) = (2x20 + x12)exp(-(2x02+ x12))를 그래프로 표현하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import numpy as np import matplotlib.pyplot as plt # 함수 f3을 정의 def f3(x0, x1): r = 2 * x0**2 + x1 ** 2 ans = r * np.exp(-r) return ans xn = 9 x0 = np.linspace(-2, 2, xn) # A x1 = np.linspace(-2, 2 ,xn) # B y = np.zeros((len(x0), len(x1))) # C for i0 in range(xn): for i1 in range(xn): y[i1, i0] = f3(x0[i0], x1[i1]) # D print(np.round(y, 1)) | cs |
xn = 9이므로 x0은 9개의 요소로 구성된 것을 알 수 있다.
print(x0): [-2. -1.5 -1. -0.5 0. 0.5 1. 1.5 2. ]
#C에서 계산 결과를 넣을 2차원 배열 변수 y를 준비하고, x0과 x1에서 정의된 바둑판의 각 점에서 f3를 구한 뒤 y[i0, i1]에 저장하고있다.
여기서 요소의 인덱스는 x1의 내용을 가리키는 인덱스 i1이 먼저오고 i0이 온다는 점
행렬 y는 print(y)로 표시가능하지만 복잡하기 때문에 numpy함수 round를 사용해준다.
np.round(y, n)를 활용해 입력 값 y를 소수점 n자리로 반올림한다.
1 | print(np.round(y, 1)) | cs |
수치를 색으로 표현하기: pcolor
1 2 3 4 5 | plt.figure(figsize=(3.5, 3)) plt.gray() # A plt.pcolor(y) # B 행렬을 색상으로 표시한다. plt.colorbar() # C 행렬 옆에 컬러 바를 의미한다. plt.show() | cs |
1 2 3 4 5 | plt.figure(figsize=(3.5, 3)) plt.pink() # A plt.pcolor(y) # B 행렬을 색상으로 표시한다. plt.colorbar() # C 행렬 옆에 컬러 바를 의미한다. plt.show() | cs |
함수의 표면을 표시: surface
1 2 3 4 5 6 7 8 9 10 11 12 13 | from mpl_toolkits.mplot3d import axes3d # A xx0, xx1 = np.meshgrid(x0, x1) # B plt.figure(figsize=(5, 3.5)) # 크기지정 ax = plt.subplot(1, 1, 1, projection='3d') # C ax.plot_surface(xx0, xx1, y, rstride=1, cstride=1, alpha=0.3, color='blue', edgecolor='black') # D ax.set_zticks((0, 0.2)) # E ax.view_init(75, -95) # F plt.show() print(x0) print(x1) | cs |
#B에서 좌표점 x0, x1으로 xx0, xx1을 만든다.
x0과 x1의 내용은 다음과 같다.
np.meshgrid(x0, x1) 명령으로 생성된 xx0은 2차원 배열이 된다.
y의 모든 요소에 대해 x0및 x1좌표가 할다된 형태로 xx0[i1, i0]과 xx1[i1, i0]를 입력했을 때 f3이 y[i1, i0]가 되고 있다.
차트를 3차원으로 만들기 위해 subplot 선언시 projection='3d'로 지정한다.
그래프의 id를 나타내는 반환값을 ax로 저장한다.
이 리스트에서는 figure내에 subplot을 하나만 지정하고 있지만, subplot(n1, n2, n, projection='3d')로 여러 좌표계를 지정할 수도 있다.
surface를 표시하는 부분은
1 2 | ax.plot_surface(xx0, xx1, y, rstride=1, cstride=1, alpha=0.3, color='blue', edgecolor='black') | cs |
인데, 옵션인 rstride와 cstride에 자연수를 부여해 가로 및 세로로 몇 개의 선을 긋는지 지정이 가능하다.
alpha는 면의 투명도를 지정하는 옵션으로 0에서 1사이의 실수로 면의 투명도를 지정하며, 1에 가까울수록 불투명해진다.
z축의 눈금은 기본 상태로 표시하면 숫자가 겹쳐진다. 그래서 ax.set_zticks((0, 0.2))명령으로 z의 눈금을 0과 0.2으로 제한하고 있다.
1 | ax.set_zticks((0, 0.2)) | cs |
ax.view_init(인수1, 인수2)는 3차원 그래프의 방향을 조절한다.
1 | ax.view_init(75, -95) | cs |
'인수1'은 상하회전으로 '0'을 지정하면 옆에서 본 그래프고, '90'을 지정하면 위에서 본 그래프가 된다.
'인수2'는 좌우회전으로 '양수'를 입력하면 시계방향으로, '음수'를 부여하면 시계반대방향으로 차트가 회전한다.
등고선으로 표시: contour
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | xn = 50 x0 = np.linspace(-2, 2, xn) x1 = np.linspace(-2, 2, xn) y = np.zeros((len(x0), len(x1))) for i0 in range(xn): for i1 in range(xn): y[i1, i0] = f3(x0[i0], x1[i1]) # A xx0, xx1 = np.meshgrid(x0, x1) plt.figure(1, figsize=(4, 4)) cont = plt.contour(xx0, xx1, y, 5, colors='black') # B cont.clabel(fmt='%3.2f', fontsize=8) # C plt.xlabel('$x_0$', fontsize=14) plt.ylabel('$y_0$', fontsize=14) plt.show() | cs |
1 | cont = plt.contour(xx0, xx1, y, 5, colors='black') # B | cs |
plt.contour(xx0, xx1, y, 5, colors='black')로 등고선 플롯을 작성한다.
5는 표시하는 높이를 5단계로 지시한다는 뜻이고, colors='black'은 등고선의 색상을 검정색으로 만든다.
plt.contour의 반환값을 cont에 저장하고 cont.clabel(fmt='%3.2f', fontsize=8)로 설정하여 각 등고선에 숫자를 넣을 수 있다.
fmt='%3.2f'로 숫자 형식을 지정하고 fontsize옵션은 문자의 크기를 지정한다.
'Python > 머신러닝 그리고 AI' 카테고리의 다른 글
DALL-E 체험기 (4) | 2022.08.01 |
---|---|
Chapter5 지도학습: 회귀 (0) | 2020.08.05 |
Chapter 4 머신러닝에 필요한 수학의 기본 (0) | 2020.07.22 |
Chapter2 파이썬 기초 (0) | 2020.07.21 |