파이썬 데이터 시각화 : 3차원 서피스 플롯(surface plot)
데이터를 받아서 분석할 때, 가장 먼저 하는 일이 데이터의 구조를 보는 것입니다. 데이터의 구조를 파악했다면, 그 다음 단계는 데이터 시각화입니다. 이번 포스팅 주제는 파이썬 데이터 시각화 도구 중 독립변수 2개일 때 함수 값을 시각화 할 수 있는 3차원 그래프(서피스 플롯) 작성 방법을 정리해보겠습니다.
글의 순서
파이썬 서피스 플롯
파이썬 판다스로 데이터 읽기
파이썬 데이터 시각화 : 서피스 플롯
파이썬 서피스 플롯
파이썬 서피스 플롯(Surface Plot)은 데이터의 상호관계를 좀 더 직관적으로 알 수 있는 시각화 방법입니다. x, y, z 데이터가 준비되어 있다면, matplotlib의 mplot3d 모듈을 사용해서 surface plot을 그릴 수 있습니다. 여기서, 독립변수를 x, y, 종속변수를 z라고 가정해보겠습니다. 이를 수학적으로 표현하면 z = f(x,y)입니다.
파이썬 판다스로 데이터 읽기
데이터가 엑셀 파일로 저장되었을 수도 있고, 텍스트 파일로 저장되어 있을 수도 있습니다. 각각의 데이터를 판다스 데이터프레임의 read_excel() 함수와, read_table() 함수를 사용해서 쉽게 불러올 수 있습니다. 데이터 파일을 읽어오는 방법에 대해서는 아래의 ‘함께 참고하면 좋은 글’에서 확인하실 수 있습니다. 이 포스팅에서는 데이터를 잘 불러와서 판다스 데이터프레임 변수로 저장했다고 가정하고 시작하겠습니다.
파이썬 데이터 시각화 : 서피스 플롯
파이썬 데이터 시각화를 위해 surface plot을 그리는 방법을 실습코드01에 나타내었습니다. 실습코드01에서 사용하고 있는 방법은 2D 그리드 형식으로 x, y, z 값 구성한 후, matplotlib 서피스 플롯을 만드는 것입니다. 이 시각화 절차를 3단계로 정리하면 다음과 같습니다.
(1) meshgrid : 데이터에서 x, y 값 중 유일한 값들을 이용하여 그리드 만들기
(2) pivot : 그리드에 맞게 z 값 재배열
(3) plot_surface : 서피스 플롯 그리기
실습코드01을 살펴보겠습니다. 파이썬으로 3차원 surface plot을 그리기 위해서는 기본적으로 matplotlib, pandas, numpy 라이브러리가 필요합니다. 먼저 데이터를 pandas.DataFrame으로 변환하고, numpy.meshgrid를 이용해 x, y 축에 대한 그리드를 생성합니다. 그 후, pandas.pivot 함수로 z 값들을 x, y 축의 그리드에 맞게 재배열하고, matplotlib의 plot_surface 함수로 서피스 플롯을 생성합니다. 이때 matplotlib 패키지에 있는 mplot3d 모듈을 사용합니다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import pandas as pd import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # DataFrame 생성 data = pd.DataFrame({ 'x': [20, 20, 20, 30, 30, 30, 40, 40, 40], 'y': [0.11, 0.12, 0.14, 0.11, 0.12, 0.14, 0.11, 0.12, 0.14], 'z': [151, 136, 120, 240, 220, 200, 300, 270, 240] }) print(data) # 01) x, y를 기준으로 그리드 생성 x = data['x'].unique() y = data['y'].unique() x, y = np.meshgrid(x, y) # 02) 그리드에 맞게 z 값을 재배열 z = data.pivot(index='y', columns='x', values='z').values # 03) 서피스 플롯 생성 # 03-1) 그래프 크기 지정 fig = plt.figure(figsize=(8, 6)) # 03-2) surface plot 생성 ax = fig.add_subplot(111, projection='3d') surf = ax.plot_surface(x, y, z, cmap='viridis') # 03-3) 그래프를 보는 각도 조절 surf = ax.view_init(30, 120) # 04) label 및 title 추가 ax.set_xlabel('X axis') ax.set_ylabel('Y axis') ax.set_zlabel('Z axis') ax.set_title('Surface Plot') # 05) 그래프를 그림파일로 저장한 후 보여주기 file_path = 'C:/_python/pandas/visual/surface/' plt.savefig(file_path +'z=f(x,y)_surface.png') plt.show() |
실습코드01을 실행시키면, 데이터프레임 변수 data가 아래처럼 출력됩니다. 그 후 서피스 플롯이 C:/_python/pandas/visual/surface/에 그림파일로 저장되며, Figure 1이라는 창이 뜨면서 아래처럼 눈으로 확인할 수도 있습니다.
Figure 1이라는 창에 보이는 surface plot을 마우스 왼쪽 버튼을 클릭해서 돌려볼 수 있습니다. 그래프를 돌리면 아래 그림과 같이 Figure 1 창의 맨 밑에 elevation=30˚, azimuth=120˚, roll=0˚이 보입니다. 서피스 플롯을 돌려보면서 데이터의 형태를 가장 잘 확인할 수 있는 각도를 찾았다면, 실습코드01의 ax.view_init(30, 120)에서 처럼 보는 각도를 파이썬 코드 내에 지정할 수 있습니다. view_init(30, 120)에서 첫 번째 매개변수 ‘30’은 elevation(상하) 각도, 두 번째 매개변수 ‘120’은 좌우(azimuth) 각도를 각각 의미합니다.
1 2 3 4 5 6 7 8 9 10 |
x y z 0 20 0.11 151 1 20 0.12 136 2 20 0.14 120 3 30 0.11 240 4 30 0.12 220 5 30 0.14 200 6 40 0.11 300 7 40 0.12 270 8 40 0.14 240 |
마치며 …
이번 포스팅에서는 파이썬 데이터 시각화 도구 중 독립변수 2개일 때 함수 값을 시각화 할 수 있는 3차원 그래프(서피스 플롯) 작성 방법을 정리해보았습니다. 서피스 플롯은 3개 변수의 상태를 동시에 확인 할 수 있다는 점에서 데이터를 시각화하는데 유용합니다. 서피스 플롯을 그리는 방법인 아래의 3단계를 기억해 주시기 바랍니다.
(1) meshgrid : 데이터에서 x, y 값 중 유일한 값들을 이용하여 그리드 만들기
(2) pivot : 그리드에 맞게 z 값 재배열
(3) plot_surface : 서피스 플롯 그리기
함께 참고하면 좋은 글 :
▶ 파이썬 데이터 시각화 : z=f(x,y), 서피스 플롯, 컨투어 플롯
▶ 파이썬 데이터 시각화 : 컨투어 플롯(contour plot, 등고선 플롯)
▶ 파이썬 판다스로 엑셀 파일의 원하는 부분 골라 읽기
▶ 파이썬 판다스로 텍스트 파일 읽기 : read_table()
▶ 파이썬 데이터 시각화 : 막대 그래프 작성 2가지 방법(maplotlib.pyplot 활용)
▶ 시계열 데이터 가시화 (4) 2개 y축 그래프로 코인 가격 비교
▶ 파이썬 데이터 분석 : 판다스 인덱스
▶ 판다스 데이터프레임으로 빠르게 데이터 파악하기
▶ 파이썬 판다스 데이터 분석 : pivot, 엑셀 입력, 출력
▶ 파이썬 바이낸스 API로 비트코인 투자 백테스팅 : 일중 강도(II) 매매 전략
▶ 파이썬 데이터 분석 : 판다스 데이터프레임 통계량, 그래프
참고자료
matplotlib, 3D plotting