[matplotlib] 3D plot
- Python/그래프 그리기
- 2021. 5. 21.
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 > 그래프 그리기' 카테고리의 다른 글
[plotly] 파이썬으로 액티비티한 그래프 그리기 (2) | 2021.05.24 |
---|---|
[matplotlib] 3D plot 앵글 바꾸기(view_init) (0) | 2021.05.22 |
[matplotlib] 히스토그램 그리기 plt.hist() (0) | 2021.05.17 |
[matplotlib] 산포 그래프(scatter) (0) | 2021.05.15 |
[matplotlib]여러개로 나누어서 그래프 출력(subplot) (0) | 2021.05.14 |