파이썬 데이터 시각화 : z=f(x,y), 서피스 플롯, 컨투어 플롯
파이썬 데이터 시각화 도구 중 독립변수가 2개일 때의 함수 값, z=f(x,y)를 시각화 할 수 있는 방법을 알아보고 있습니다. 지난 포스팅에서 3차원 서피스 플롯과 함수값까지 쉽게 읽을 수 있는 컨투어 플롯까지 알아보았습니다. 이번엔 이 둘을 함께 그리는 파이썬 코드를 작성해보겠습니다.
글의 순서
서피스 플롯 vs, 컨투어 플롯
파이썬 데이터 시각화 : 서피스 플롯 + 컨투어 플롯
서피스 플롯 vs, 컨투어 플롯
지난 포스팅에서 3차원 데이터 z=f(x,y)를 가시화 할 수 있는 방법인 서피스 플롯과 컨투어 플롯을 그리는 방법을 알아보았습니다. 서피스 플롯(surface plot)을 통해 데이터를 한 눈에 파악하고, 서피스 플롯으로는 알아내기 힘든 데이터를 컨투어 플롯으로 확인할 수 있었습니다. 컨투어 플롯은 파이썬 matplotlib 패키지로 그릴 수 있는 데이터 가시화 도구로 3차원 데이터를 2차원 평면에 나타내는 방식 중 하나입니다.
참고로, 공학에서 널리 사용되고 있는 카펫 플롯(carpet plot)도 3차원 데이터를 2차원 평면에 나타내는 방식 중 하나인데, 파이썬 matplotlib 패키지로는 그릴 수 없습니다.
파이썬 데이터 시각화 : 서피스 플롯 + 컨투어 플롯
이번 포스팅에서는 하나의 그림(Figure)에 서피스 플롯과 컨투어 플롯을 함께 그려서 데이터를 좀 더 쉽게 파악할 수 있도록 해보겠습니다. 실습코도01에 이 두 개의 그래프를 한꺼번에 그리는 방법을 나타내었습니다.
실습코도01은 왼쪽에 서피스 플롯을, 오른쪽에는 컨투어 플롯을 그려줍니다. 각 플롯에는 축 레이블과 제목이 있으며, 컬러바(color bar)도 포함되어 있습니다. 실습코드01에서 기억해 둘만한 것들을 아래에 정리하였습니다.
line 25~27
▶plt.subplots(1, 2) : 1행 2열의 서브플롯을 생성합니다. 이는 두 개의 그래프를 나란히 표시한다는 뜻입니다.
▶figsize=(16, 6)는 전체 그림(Figure)의 크기를 가로 16인치, 세로 6인치로 설정합니다.
▶subplot_kw={‘projection’: ‘3d’}는 첫 번째 서브플롯(서피스 플롯)을 3D로 설정합니다.
▶gridspec_kw={‘width_ratios’: [1, 1]}는 두 서브플롯의 너비 비율을 1:1로 설정합니다.
line 30
▶첫 번째 서브플롯(axs[0])에 서피스 플롯을 그립니다. x, y, z는 각각의 축에 해당하는 데이터입니다.
▶cmap=’viridis’는 컬러맵을 ‘viridis’로 설정합니다.
line 31
▶ 서피스 플롯에 대한 컬러 바를 추가합니다.
▶ shrink는 컬러 바의 크기를 줄이고, aspect는 컬러 바의 종횡비를 설정합니다.
line 40 : axs[1].remove()로 기존에 생성된 두 번째 서브플롯을 제거합니다. 이는 3D 설정을 2D로 변경하기 위함입니다.
line 41 : axs[1] = fig.add_subplot(122)로 새로운 2D 서브플롯을 생성하여 두 번째 위치에 배치합니다.
line 42 : 두 번째 서브플롯(axs[1])에 컨투어 플롯을 그립니다. 여기서도 cmap=’viridis’를 사용합니다.
line 43 : 컨투어 플롯에 컬러 바를 추가합니다.
line 50 plt.tight_layout()로 서브플롯들이 겹치지 않도록 레이아웃을 조정합니다.
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 44 45 46 47 48 49 50 51 52 |
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) surface + contour(등고선) 플롯을 한 페이지에 생성 # 03-1) 그래프 배치, 크기 지정 fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(16,6), subplot_kw = {'projection':'3d'}, gridspec_kw = {'width_ratios':[1,1]}) # 03-2) surface plot 생성 surf = axs[0].plot_surface(x, y, z, cmap='viridis') fig.colorbar(surf, ax=axs[0], shrink=0.5, aspect=5) axs[0].set_xlabel('X axis') axs[0].set_ylabel('Y axis') axs[0].set_zlabel('Z axis') axs[0].set_title('Surface Plot', fontsize=16) axs[0].view_init(30,120) # 03-3) contour plot 생성, 2D 그래프 축 설정 axs[1].remove() axs[1]=fig.add_subplot(122) contour = axs[1].contourf(x,y,z,cmap='viridis') fig.colorbar(contour, ax=axs[1], shrink=0.5, aspect=5) axs[1].set_title('Contour Plot', fontsize=16) axs[1].set_xlabel('X axis', fontsize=16) axs[1].set_ylabel('Y axis', fontsize=16) # 03-4) 그래프를 파일로 저장, 보여주기 file_path = 'C:/_python/pandas/visual/surface/' plt.tight_layout(pad=3) plt.savefig(file_path +'z=f(x,y)_surface+contour.png') plt.show() |
실습코드01을 실행시키면, 데이터프레임 변수 data가 아래처럼 출력됩니다. 그 후 서피스+컨투어 플롯이 C:/_python/pandas/visual/surface/에 그림파일로 저장되며, Figure 1이라는 창이 뜨면서 아래처럼 눈으로 확인할 수도 있습니다.
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개일 때의 함수 값, z=f(x,y)를 시각화 할 수 있는 방법입니다. 이렇게 두 개의 그래프를 하나의 그림(Figure)로 나타내면, 함수 형태와 함께 함수 값까지 한꺼번에 파악할 수 있습니다. 이 포스팅이 파이썬 데이터 분석에 유용하게 활용되길 바랍니다.
함께 참고하면 좋은 글 :
▶ 머신러닝 수학 : 인공지능은 함수
▶ 파이썬 데이터 시각화 : 3차원 서피스 플롯(surface plot)
▶ 파이썬 데이터 시각화 : 컨투어 플롯(contour plot, 등고선 플롯)
▶ 파이썬 데이터 시각화 : 막대 그래프 작성 2가지 방법(maplotlib.pyplot 활용)
▶ 시계열 데이터 가시화 (4) 2개 y축 그래프로 코인 가격 비교
▶ 파이썬 판다스 데이터 분석 : pivot, 엑셀 입력, 출력
참고자료
matplotlib, 3D plotting