Processing math: 100%

[matplotlib] 3D plot

반응형
반응형

matplotlib를 이용해 3D 그래프를 그려보겠습니다.

분야에 따라서 많이 쓰이는 곳도 있고 아닌 곳도 있지만 여러모로 유용하게 쓸 수 있는 툴입니다. 

더 좋은 모듈이 있지만 파이썬의 기본 모듈로 그릴 수 있는 것도 좋을 것 같아서 공유의 의미로 포스팅을 할까 합니다.

 

3차원 그래프를 그리는 것이니 3차원 좌표가 필요합니다.

3차원 좌표를 바로 만들어서 할 수도 있고

함수에 의해 데이터가 이루어진다면 z=f(x,y) 으로 여기고 그에 맞게 데이터를 맞춰주면 됩니다. 

 

함수에 의해 움직이는 데이터를 가지고 해보겠습니다.

import numpy as np
x = np.linspace(50,150,24)
y = np.linspace(0.5,2.5,24)
x,y = np.meshgrid(x,y)
z = (x-100)**2/y

x,y 데이터를 가지고 z=f(x,y)  만들어야 하는데 (x,y)의 좌표로써 z를 움직여야 하므로 meshgrid를 이용해 좌표를 

만들었습니다.

meshgrid 없이 z를 정의 하면 z가 1차원 배열로 이루어져 3D 그래프를 만들 때 오류가 발생합니다.

항상 z자리는 2차원 배열로 이루어지게 해주어야 정상적으로 작동하니 주의해주셔야겠습니다.

 

이제 그래프를 그려봅시다.

이번엔 3D 그래프를 그리기로 해서 Axes3D 라는 모듈을 씁니다.  

 

그래프를 그리기 위해 fig를 만들고 축을 세우고 그 축 위에 그리면 되는데요.

gca()를 활용해서 축을 2D로 할건지 3D로 할건지 정합니다.

3D를 쓸거니 fig.gca(projection='3d') 로 씁니다. 

그리고 plot_surface 로 그립니다. 

필수적인 건 아니지만 라벨과 colorbar도 넣겠습니다.

gca() 는 편의상 ax라 하고 plot_surface는 surf라 하겠습니다.

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10,6))
ax = fig.gca(projection='3d')
surf = ax.plot_surface(x,y,z,rstride=2,cstride=2,cmap=plt.cm.coolwarm,linewidth=0.5,antialiased=True)
ax.set_xlabel('x axis')
ax.set_ylabel('y axis')
ax.set_zlabel('z axis')
plt.title('3D')
fig.colorbar(surf,shrink=0.5,aspect=5)

실행을 시키면 나름 괜찮게 그래프가 그려집니다.

코딩을 친 것을 봐도 나름 쉽게 그래프를 그렸습니다.

좀 더 응용을 하기 위해서는 matplotlib의 동작방식을 이해하면 좋은데요.

matplotlib는 프레임 위에 축 위에 그래프를 그리는 방식입니다.

그래서 프레임(fig)을 제일 먼저 만들고 축(ax), 그리고 그래프(surf) 순서로 채우게 됩니다.

2차원 그래프에서는 단순한 구조라서 따로 표기를 하지 않아도 무엇을 의미하는지 다 알아서 넘어갔지만 3차원에서는 보다 복잡한 구조라 순서대로 입력을 해줘야 오류가 안 생깁니다.

 

또한, 부가적인 부분(라벨, colorbar, title)을 어디에 그리는 것을 명시해주어야 합니다.

라벨을 붙일 때 축에다 붙여야 하니 ax.set_xlabel로 쓰게 되는 것이고 colorbar는 그래프 밖에 있어야 하니 fig.colorbar로 넣습니다. 

title을 붙일 때는 fig 전체에 대한 title이니 plt.title이 됩니다.

 

 

plot_surface의 파라미터를 설명하고 마치겠습니다.

  • x,y,z : 데이터값
  • rstride : 행 배열 스텝 사이즈
  • cstride : 열 배열 스텝 사이즈
  • color : surface pathes 의 색깔
  • cmap : surface pathes의 color map
  • norm : Normalize
  • vmin : 최소값
  • vmax : 최대값
  • antialiased : 위신호 제거(높은 해상도의 신호를 낮은 해상도에서 나타낼때 생기는 계단현상)

 

 

관련 포스팅

[Python/Numpy] - [Numpy]격자 그리드 만들기(meshgrid)

[Python/Numpy] - ndarray 데이터로 그래프 그리기(matplotlib)

데이터목장님의
글이 좋았다면 응원을 보내주세요!

Designed by JB FACTORY