본문 바로가기
머신러닝/개념익히기

3차원 그래프 그리기

by ADELA_J 2023. 5. 9.

1. 이변수 함수 그리기.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#함수 f3을 정의
def f3(x0, x1):
    r = 2* x0**2 + x1**2
    ans = r*np.exp(-r)
    return ans

#x0, x1에서 각각 f3을 계산
xn = 9		#구간이 더 촘촘해질수록 부드러운 모양의 그래프가 나옴
x0 = np.linspace(-2,2, xn)		#x0의 범위
x1 = np.linspace(-2,2, xn)		#x1의 범위
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])

print(x0)
print(np.round(y,1))

plt.figure(figsize=(3.5,3))
plt.gray()
plt.pcolor(y)
plt.colorbar()
print(plt.show())

  ▶ 지수함수의 계산식 / 전체 계산식 = 입력값 2개 , 출력값 1개 

     ▷ 총 3개의 값으로 3차원 그래프가 그려지는 것.

 

  ▶ np.linspace (범위low, 범위high, 구간) : 시작값, 끝값, 그 사이를 몇개로 나눌것인지(디폴트 값은 50개) 결정

  ▶ 해당 그래프는 도너츠 같은 모습을 하고 있는데 (출력값도 그렇다)

      수치를 더 눈에 잘 들어오는 그래프를 그려보기

 

  plt.gray() / plt.jet() / plt.pink() / plt.bone() 등 다양한 그라데이션 패턴을 가진 그래프가 존재

 

2. surface 그래프. : 함수의 표면을 표시하는 3차원 입체 그래프

  ▼ subplot(n1, n2, n, projection='3d')는 3차원 그래프를 그리겠다고 선언한거  ▼ rstride와 cstride에는 자연수를 부여해 가로 및 세로로 몇 개의 선을 긋는지. 적을수록 선의 간격이 조밀해짐.  ▼ ax.view_init(인수1, 인수2)는 3차원 그래프의 방향을 조절  ▼ ax.set_zticks((0,0.2)) : z의 눈금을 0과 0.2으로 제한하고 있음. 기본으로하면 숫자가 겹쳐져버림

 

from mpl_toolkits.mplot3d import Axes3D

def f3(x0, x1):
    r = 2* x0**2 + x1**2
    ans = r*np.exp(-r)
    return ans

#x0, x1에서 각각 f3을 계산
xn = 9
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])

xx0, xx1 = np.meshgrid(x0,x1)
plt.figure(figsize=(5, 3.5))
ax = plt.subplot(1,1,1, projection='3d')
ax.plot_surface(xx0, xx1, y, rstride=1, cstride=1, alpha=0.3, color='blue', edgecolor='black')
ax.set_zticks((0, 0.2))
ax.view_init(70,-95)
plt.show()

 

▶np.meshgrid(x0, x1) 으로 만들어진 xx0, xx1은 나온 값을 2차원 배열로 만들어   

: linspace 값을 배열로 만들어줌(여기서는),

▼ 요런식 : x값은 열 방향의 값들이 다 동일하고, y값 자리에는 행 방향의 값들이 다 동일하다.

▼ 두번째 xx1은 y와 같은 크기의 행렬이 나옴.

 

3. contour : 등고선 그래프

  ▼ xn 은 원래는 구간이나 등고선 그래프에서는 밀도를 의미함

  ▼ plt.contour(xx0, xx1, y, 5, colors='black')로 등고선 플롯을 작성. 5는 표시하는 높이를 단계로 지시

  ▼ plt.contour 반환값을 cont에 저장후

     ▷ cont.clabel(fmt='%3.2f', fontsize=8) 에 설정해 등고선에 숫자를 추가. fmt='3.2f'로 숫자형식 지정

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])

xx0, xx1 = np.meshgrid(x0,x1)

plt.figure(1, figsize=(4,4))
cont = plt.contour (xx0, xx1, y, 5, colors='black')
cont.clabel(fmt='%3.2f', fontsize=8)
plt.xlabel('$x_0$', fontsize=14)
plt.ylabel('$x_1$', fontsize=14)

plt.show()

 

'머신러닝 > 개념익히기' 카테고리의 다른 글

지수함수와 로그함수  (0) 2023.05.16
행렬  (0) 2023.05.16
머신러닝에 필요한 수학 기본 - 합 / 곱 / 미분  (0) 2023.05.15
벡터와 연산  (0) 2023.05.10
3차 함수 그래프 그리기  (0) 2023.05.09