코딩하는 해맑은 거북이
[데이터시각화] Facet 본문
본 게시물의 내용은 '부스트캠프 AI Tech - Data Visualization(안수빈)' 강의를 듣고 작성하였다.
해당 글은 아래의 7가지를 다룬다.
🍀 Facet
🍀 Figure & Axes
🍀 NxM subplots
🍀 Grid Spec의 활용
🍀 내부에 그리기
🍀 외부에 그리기
- Facet이란 분할을 의미
- 화면 상에 View를 분할 및 추가하여 다양한 관점을 전달
- 같은 데이터셋에 서로 다른 인코딩을 통해 다른 인사이트
- 같은 방법으로 동시에 여러 feature를 보거나
- 큰 틀에서 볼 수 없는 부분 집합을 세세하게 보여줄 수 있음
- Figure는 큰 틀, Ax는 각 플롯이 들어가는 공간
- Figure는 언제나 1개, 플롯은 N개
- Figure Color : fig.set_facecolor(색깔)
fig, ax = plt.subplots()
fig.set_facecolor('lightgray')
plt.show()
- 가장 쉬운 방법은 3가지
- plt.subplot()
fig = plt.figure()
ax1 = plt.subplot(121)
ax2 = plt.subplot(122)
plt.show()
- plt.figure() + fig.add_subplot()
fig = plt.figure()
ax = fig.add_subplot(121)
ax = fig.add_subplot(122)
plt.show()
- plt.subplots()
fig, (ax1, ax2) = plt.subplots(1, 2)
plt.show()
fig, axes = plt.subplots(1, 2)
plt.show()
- 쉽게 조정할 수 있는 요소
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.plot([1, 2, 3], [1, 4, 9])
ax2.plot([1, 2, 3], [1, 2, 3])
plt.show()
- figuresize : plt.figure(figsize=(x, y))
fig = plt.figure(figsize=(12, 5))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.plot([1, 2, 3], [1, 4, 9])
ax2.plot([1, 2, 3], [1, 2, 3])
plt.show()
- dpi : Dots per Inch : 인치에 해당하는 dot 수를 정하는 인자로 해상도를 의미 (default=100)
fig = plt.figure(dpi=150)
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.plot([1, 2, 3], [1, 4, 9])
ax2.plot([1, 2, 3], [1, 2, 3])
plt.show()
cf) 해상도 설정해서 파일 저장하기 : fig.savefig('file_name', dpi=150)
- sharex, sharey : 축 공유하기
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.plot([1, 2, 3], [1, 4, 9])
ax2 = fig.add_subplot(122, sharey=ax1)
ax2.plot([1, 2, 3], [1, 2, 3])
plt.show()
fig, axes = plt.subplots(1, 2, sharey=True)
axes[0].plot([1, 2, 3], [1, 4, 9])
axes[1].plot([1, 2, 3], [1, 2, 3])
plt.show()
- squeeze
- subplots()로 생성하면 기본적으로 다음과 같이 서브플롯 ax 배열이 생성된다.
- 1 x 1 : 객체 1개 (ax)
- 1 x N 또는 N x 1 : 길이 N 배열 (axes[i])
- N x M : N by M 배열 (axes[i][j])
- numpy ndarray에서 각각 차원이 0, 1, 2로 나타납니다. 이렇게 되면 경우에 따라 반복문을 사용할 수 있거나, 없거나로 구분된다. squeeze를 사용하면 항상 2차원으로 배열을 받을 수 있고, 가변 크기에 대해 반복문을 사용하기에 유용하다.
- subplots()로 생성하면 기본적으로 다음과 같이 서브플롯 ax 배열이 생성된다.
n, m = 1, 3
fig, axes = plt.subplots(n, m, squeeze=False, figsize=(m*2, n*2))
idx = 0
for i in range(n):
for j in range(m):
axes[i][j].set_title(idx)
axes[i][j].set_xticks([])
axes[i][j].set_yticks([])
idx+=1
plt.show()
n, m = 2, 3
fig, axes = plt.subplots(n, m, figsize=(m*2, n*2))
for i, ax in enumerate(axes.flatten()): # flatten() 함수 사용하여 1중 반복문으로 쓰기
ax.set_title(i)
ax.set_xticks([])
ax.set_yticks([])
plt.show()
- aspect : 플롯의 비율값 = 세로비율/가로비율
fig = plt.figure(figsize=(12, 5))
ax1 = fig.add_subplot(121, aspect=1)
ax2 = fig.add_subplot(122, aspect=0.5)
plt.show()
fig = plt.figure(figsize=(12, 5))
ax1 = fig.add_subplot(121, aspect=1)
ax2 = fig.add_subplot(122, aspect=0.5)
ax2.set_xlim(0, 1)
ax2.set_ylim(0, 2)
plt.show()
- 그리드 형태의 subplots
- 기존 Subplots로 4 x 4를 만들 수 있음
- 여기서 다른 사이즈를 만들기 위해서는?
- Slicing 사용
- Numpy의 Slicing을 생각해보면…
🟦 axes[0, :3]
🟨 axes[1:, :3]
🟪 axes[:, 3] - fig.add_grid_spec()
- Numpy의 Slicing을 생각해보면…
fig = plt.figure(figsize=(8, 5))
gs = fig.add_gridspec(3, 3) # make 3 by 3 grid (row, col)
ax = [None for _ in range(5)]
ax[0] = fig.add_subplot(gs[0, :])
ax[0].set_title('gs[0, :]')
ax[1] = fig.add_subplot(gs[1, :-1])
ax[1].set_title('gs[1, :-1]')
ax[2] = fig.add_subplot(gs[1:, -1])
ax[2].set_title('gs[1:, -1]')
ax[3] = fig.add_subplot(gs[-1, 0])
ax[3].set_title('gs[-1, 0]')
ax[4] = fig.add_subplot(gs[-1, -2])
ax[4].set_title('gs[-1, -2]')
for ix in range(5):
ax[ix].set_xticks([])
ax[ix].set_yticks([])
plt.tight_layout()
plt.show()
- x, y, dx, dy를 사용
- 시작 위치 x, y와 차이 dx, dy로도 표현
- (x, y), dx, dy 포맷으로 작성하면
🟦 (0, 0), 1, 3
🟨 (1, 0), 3, 3
🟪 (0, 3), 1, 4 - fig.subplot2grid()
- fig.add_axes()
fig = plt.figure(figsize=(8, 5)) # initialize figure
ax = [None for _ in range(6)] # list to save many ax for setting parameter in each
ax[0] = plt.subplot2grid((3,4), (0,0), colspan=4)
ax[1] = plt.subplot2grid((3,4), (1,0), colspan=1)
ax[2] = plt.subplot2grid((3,4), (1,1), colspan=1)
ax[3] = plt.subplot2grid((3,4), (1,2), colspan=1)
ax[4] = plt.subplot2grid((3,4), (1,3), colspan=1,rowspan=2)
ax[5] = plt.subplot2grid((3,4), (2,0), colspan=3)
for ix in range(6):
ax[ix].set_title('ax[{}]'.format(ix)) # make ax title for distinguish:)
ax[ix].set_xticks([]) # to remove x ticks
ax[ix].set_yticks([]) # to remove y ticks
fig.tight_layout()
plt.show()
fig = plt.figure(figsize=(8, 5))
ax = [None for _ in range(3)]
ax[0] = fig.add_axes([0.1,0.1,0.8,0.4]) # x, y, dx, dy
ax[1] = fig.add_axes([0.15,0.6,0.25,0.6])
ax[2] = fig.add_axes([0.5,0.6,0.4,0.3])
for ix in range(3):
ax[ix].set_title('ax[{}]'.format(ix))
ax[ix].set_xticks([])
ax[ix].set_yticks([])
plt.show()
- Ax 내부에 서브플롯을 추가하는 방법
- 미니맵과 같은 형태로 추가하거나
- 외부 정보를 적은 비중으로 추가
- ax.inset_axes()
fig, ax = plt.subplots()
axin = ax.inset_axes([0.8, 0.8, 0.2, 0.2])
plt.show()
fig, ax = plt.subplots()
color=['royalblue', 'tomato']
ax.bar(['A', 'B'], [1, 2],
color=color
)
ax.margins(0.2)
axin = ax.inset_axes([0.8, 0.8, 0.2, 0.2])
axin.pie([1, 2], colors=color,
autopct='%1.0f%%')
plt.show()
- make_axes_locatable() : 일반적으로 colorbar에 많이 사용한다
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
fig, ax = plt.subplots(1, 1)
ax_divider = make_axes_locatable(ax)
ax = ax_divider.append_axes("right", size="7%", pad="2%") # 전체사이즈의 7%, 패딩 : 2%
plt.show()
fig, ax = plt.subplots(1, 1)
# 이미지를 보여주는 시각화
# 2D 배열을 색으로 보여줌
im = ax.imshow(np.arange(100).reshape((10, 10)))
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
fig.colorbar(im, cax=cax)
plt.show()
'Data Analysis & Viz' 카테고리의 다른 글
[데이터시각화] Seaborn (0) | 2023.03.27 |
---|---|
[데이터시각화] Grid, 선/면 추가, 테두리 설정, Setting 변경 (0) | 2023.03.22 |
[데이터시각화] Color (0) | 2023.03.22 |
[데이터시각화] Text (0) | 2023.03.22 |
[데이터시각화] Scatter Plot (0) | 2023.03.22 |
Comments