[PYTHON] matplotlib을 활용하여 3차원 그래프 그리기

2023. 10. 6. 21:13DATA PROGRAMMING/PYTHON

matplotlib 2차원 그래프 그리기

t1 = np.linspace(-2, 2, 10)

# x와 y 배열 생성
x = 2 * t1
y = t1**2 + 2 * t1

# 그래프 그리기
plt.figure(figsize=(8, 6))  # 그래프 크기 설정
plt.plot(x, y, marker='o', linestyle='-')  # 선 그래프 그리기
plt.xlabel('x')  # x축 레이블 설정
plt.ylabel('y')  # y축 레이블 설정
plt.show()  # 그래프 표시

linspace 함수를 통해 -2부터 2까지 동일간격의 값 10개를 t1에 저장하고, x축과 y축에 해당하는 값을 설정한다.

8*6짜리 figure를 만들고 x축, y축, marker, linestyle을 설정한 plot을 만들어 준다.

만약 조금 더 매끄러운 곡선형태의 그래프를 그리고 싶으면 값들이 많으면 된다. 이는 linsapce의 갯수 인자를 늘리면 된다. 또한 이때는 marker를 설정하지 않는것이 좋다.

 

t1 = np.linspace(-2, 2, 100)

# x와 y 배열 생성
x = 2 * t1
y = t1**2 + 2 * t1

# 그래프 그리기
plt.figure(figsize=(8, 6))  # 그래프 크기 설정
plt.plot(x, y, linestyle='-')  # 선 그래프 그리기
plt.xlabel('x')  # x축 레이블 설정
plt.ylabel('y')  # y축 레이블 설정
plt.show()  # 그래프 표시

 

 

 

이를 활용해 3차원 그래프도 만들어 보자.

 

 

matplotlib 3차원 그래프 그리기

 

보통 3차원 함수는 이변수 함수인 경우가 많다. 2차원 함수는 하나의 변수(x)에 대한 종속 변수y를 표현한다면, 3차원 함수는 두개의 변수(x, y)에 대한 하나의 종속변수 z를 표현하는 그래프이다.

 

예를 들어,

해당 함수를 표현한다고 하자, 일단 이를 정희하기 위해선 파이썬에서도 def를 통해 함수를 정의할 필요가 있다.

 

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

자연대수 e를 표현하기위해 numpy의 exp 함수를 활용한다.

 

 

이제 변수 x0, x1에 대입할 수들을 생성해준다.

num = 9
x0=np.linspace(-2,2,num)
x1=np.linspace(-2,2,num)
y=np.zeors((len(x0),len(x1)))

for i0 in range(num):
	for i1 in range(num):
		y[i1,i0] = f3(x0[i0], x1[i1])

해당함수를 통해 두개의 독립변수에 9개의 숫자를 부여하고, 종속변수 y 값은 두 독립변수에 의해 결정되기에 우선 모든 값이 0인 9*9 행렬형태로 만들고, 두 독립변수를 함수에 대입한 함숫값을 각 위치에 대입한다.

이러면 변수 x0,x1 각 값들과 이에 대한 함숫값들까지 모두 만든 것이고 이를 활용해 3차원 공간에 그래프를 그려주면 된다. 이때, 함숫값(y값)을 z축으로 설정하도록 한다.

 

x0과 x1은 현재 1차원 데이터이고, y는 2차원의 데이터이므로 차원을 맞춰 주기 위해  meshgrid 함수를 사용한다. 즉, x0과 x1을 이용한 평면위의 격자를 만드는 과정이다.

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

print(xx0)
print(xx1)

 

 

 

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='yellow',edgecolor='black')
ax.set_zticks((0,0.2))
ax.view_init(75,-95) #상하각도와 좌우각도, 그래프를 바라보는 각도를 설정한다.
plt.show()

여기서 rstride와 cstride는 각각 행과 열의 추출 간격을 뜻한다. 둘 다 1로 설정했으므로, 1칸씩 동일한 간격으로 값을 추출하게 설정한 셈이다.