Coding Diary.

(데이터분석) matplotlib의 figure, axes, subplots의 개념 본문

Coding/Data analysis

(데이터분석) matplotlib의 figure, axes, subplots의 개념

life-of-nomad 2024. 5. 25. 13:19
728x90
반응형
지난 글에서 설명한 matplotlib에 이어
figure, axes, subplots에 대해 알아보겠습니다.

 

 

(데이터분석) seaborn과 matplotlib으로 히스토그램 나타내기

히스토그램은 숫자 변수의 분포를 나타낼 때 사용합니다. 막대 그래프를 정량적 변수에 적용한 것과 같습니다.하지만 하나의 막대로 각 고유 범주에 속하는 값의 개수를 나타내는 대신, 값을

life-of-nomad.tistory.com

 

  • 먼저, seaborn은 matplotlib을 기반으로 구축되었습니다. 
  • 알려드릴 내용은 seaborn에도 적용됩니다. 
  • 참고로, seaborn을 이용하면 더욱 간단하게 할 수 있습니다.

1. Figures, Axes, and Subplots

  • 먼저, 데이터를 불러오겠습니다.
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('data/diamonds.csv')
df.shape

df.head(5)

 

1) Figure Objects

  • 대부분은 matplotlib의 메인 라이브러리인 pyplot 함수를 사용합니다.
  • pyplot은 plt로 불러옵니다. 
  • 어떤 차트를 작성하든지, 가장 먼저 생성되는 것은 figure 객체입니다.
  • 예를 들어, 히스토그램을 작성한다면 히스토그램을 그릴 캔버스인 figure이 먼저 생성됩니다.
  • 그 다음에 axes가 생성되고 마지막으로 그 axes위에 히스토그램을 그리는 것입니다.
plt.hist(data=df, x='x')

  • 먼저, figure을 직접 생성해보겠습니다.
  • figure생성과 관련된 정보를 확인하기 위해서 끝에 세미콜론을 붙이지 않겠습니다.
plt.figure(figsize=(4, 3))

  • 즉, axes가 추가되지 않은 400x300픽셀 크기의 figure이 생성되었음을 알 수 있습니다.
  • 이 figure 객체에서 axes의 위치를 정확히 지정할 수도 있습니다.
  • figure을 만들고 나서 fig라는 객체에 저장한 다음 add_axes를 통해 axes의 위치를 정확히 지정할 수 있습니다.
  • 그리고 그 위에 히스토그램을 작성할 수 있습니다.
  • add_axes 함수는 세밀한 맞춤형 차트를 만들 때 유용하게 사용할 수 있습니다.
#Create a new figure
fig = plt.figure(figsize=(4, 3))

#The argument of add_axes represents the dimension [left(좌측여백), bottom(하단여백), width(가로길이), height(세로길이)] fo the new axes.
#All quantities are in fractions of figure width and height.
ax = fig.add_axes([.125, .125, .775, .755])
ax.hist(data=df, x='x');

 

2) Sub-plots

  • 만약, figure 안에 두 개의 subplot을 만들고 싶다면 pyplot의 subplot메서드를 사용하면 됩니다.
  • 이는 n개의 행과 m개의 열을 만들며 이 틀을 바탕으로 각 칸에서 차트를 만들 수 있습니다. 
  • 예를 들어, 네 개의 히스토그램이 존재하는 그리드를 만들고 싶다면 먼저 figure을 만든 다음 subplot을 호출하면 됩니다.
  • 행과 열을 두 개식 지정한 다음 subplot1 만들어보겠습니다. 
  • 결과를 확인하는 차원에서 subplot2,3을 생성하지 않았습니다.
  • 그 다음, 왼쪽 상단에 배치될 subplot1과 오른쪽 하단에 배치될 subplot4를 만들어보겠습니다.
#Resize the chart, and have two plots side-by-sids
#set a large figure size for subplots
plt.figure(figsize = [8, 5])

#histogram on left, example of too-large bin size
plt.subplot(2, 2, 1) #2행, 2열의 subplot 1 첫번째 요소
bins = np.arange(0, df['x'].max()+1/4, 1/4)
plt.hist(data=df, x='x', bins=bins);

#histogram on right, example of too-small bin size
plt.subplot(2, 2, 4) #2 row, 2 cols, subplot 4
bins = np.arange(0, df['x'].max()+1/4, 1/4)
plt.hist(data=df, x='x', bins=bins);

  • 결과적으로, 네 개의 subplot을 추가할 수 있는 캔버스가 완성되었지만 subplot은 두 개만 생성되었습니다.

3) Axes Objects

  • 특정한 축 객체를 원하는 대로 설정할 수도 있습니다.
  • 먼저, pyplot을 바로 호출하면 어떻게 되는지 확인해보겠습니다.
  • 히스토그램 함수를 호출하면서 pyplot을 바로 호출했고 이어서 x축 레이블을 설정하기 위해 pyplot을 바로 호출했습니다.
plt.hist(data=df, x='x')
plt.xlabel('My x axis title')

  • 또는 pyplot함수 get current access(gca)를 사용해서 축 객체를 가져온 다음 access 함수인 set_xlabel을 사용해서 x축의 레이블을 직접 설정하는 방법도 있습니다.
  • 결과는 위와 똑같고, 차이점은 호출 구문이 약간 다르다는 것 뿐입니다.
plt.hist(data=df, x='x');
ax = plt.gca()
ax.set_xlabel('My x axis title')
  • 축을 직접 지정하면 편리한 이유는 여러 개의 subplot을 만들 때 각각을 개별적으로 설정 가능 즉, 여러 subplot을 순회할 필요가 없습니다.
    • 예를 들어, pyplot함수 subplots 를 사용한다고 합시다(*s 주의)
    • 이 경우에는 행, 열의 개수와 figure 크기를 직접 지정할 수 있습니다.
    • 그 결과로 figure 객체와 axes 객체의 배열이 반환됩니다.
    • 따라서 두 개의 subplot을 나란히 배치하고 싶다면 axes 객체를 seaborn 이나 matplotlib에 바로 전달해서 그에 대한 작업을 할 수 있습니다.
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 3))
sns.countplot(data=df, x='cut', color='tab:blue', ax=ax1)
sns.countplot(data=df, x='clarity', color='tab:red', ax=ax2)

  • 한편 seaborn은 일반적으로 axes 객체를 반환합니다.
  • 따라서 seaborn 차트를 만들 때 axes를 지정하지 않았다면 함수 호출을 통해 축을 가져온 다음 직접 레이블을 지정하거나 필요한 설정을 적용하는 등의 작업을 할 수 있습니다.
ax = sns.countplot(data=df, x='cut', color='tab:blue')
ax.set_xlabel('My x axis label!')

728x90
반응형