pbj0812의 코딩 일기

[PYTHON] matplotlib 으로 FacetGrid 함수 구현하기 본문

ComputerLanguage_Program/PYTHON

[PYTHON] matplotlib 으로 FacetGrid 함수 구현하기

pbj0812 2021. 8. 2. 02:20

0. 목표

 - matplotlib 으로 FacetGrid 구현하기

1. FacetGrid 예제

import seaborn as sns

tips = sns.load_dataset("tips")

g = sns.FacetGrid(tips, col="sex", row="time", margin_titles=True, despine=False)
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.set_axis_labels("Total bill", "Tip")
g.fig.subplots_adjust(wspace=0, hspace=0)

2. 실습

 1) library 호출

import matplotlib.pyplot as plt

 2) 함수 작성

  (1) 도화지 분할

  (2) 카테고리 마다의 유니크 항목 구하기

  (3) 칸마다 그림 그리기

  (4) 각 그림에서의 tick 최소값, 최대값 가져오기

  (5) 모든 그림에 전체 그림의 tick 최소값, 최대값 적용

  (6) tick, label, title 데코레이션

def FacetGrid(df, row, col, xx, yy):
    # 1
    fig, ax = plt.subplots(len(df[col].unique()), len(df[row].unique()))
    fig.subplots_adjust(wspace=0, hspace=0)
    
    # 2
    X = df[row].unique()
    Y = df[col].unique()
    fig.set_size_inches(len(X) * 5, len(Y) * 5)
    
    x_min = []
    y_min = []
    x_max = []
    y_max = []

    for i in range(len(X)):
        for j in range(len(Y)):
            # 3
            x = df[(df[row] == X[i]) & (df[col] == Y[j])][xx]
            y = df[(df[row] == X[i]) & (df[col] == Y[j])][yy]
            ax[i][j].plot(x, y, 'bo')
            
            # 4
            x_min.append(min(ax[i][j].get_xticks()))
            x_max.append(max(ax[i][j].get_xticks()))
            y_min.append(min(ax[i][j].get_yticks()))
            y_max.append(max(ax[i][j].get_yticks()))

    for i in range(len(X)):
        for j in range(len(Y)):
            # 5
            ax[i][j].set_xlim(min(x_min), max(x_max))
            ax[i][j].set_ylim(min(y_min), max(y_max))
            
            # 6
            if i == 0:
                ax[i][j].set_xticks([])
                ax[i][j].set_title(row + ' = ' +X[j], fontsize = 20)
            else:
                ax[i][j].set_xlabel(xx, fontsize = 20)
            if j != 0:
                ax[i][j].set_yticks([])
                ax2 = ax[i][j].twinx()
                ax2.set_yticks([])
                ax2.set_ylabel(col + ' = ' + Y[i], fontsize = 20, rotation = -90, labelpad = 20)
            else:
                ax[i][j].set_ylabel(yy, fontsize = 20)

3. 결과

FacetGrid(tips, 'sex', 'time', 'total_bill', 'tip')

4. 참고

 - matplotlib.axes.Axes.set_ylabel

 - Matplotlib 에서 X 축 눈금 레이블 텍스트를 회전하는 방법

 - matplotlib y-axis label on right side

 - [python] matplotlib 플롯에서 xticks를 제거 하시겠습니까?

 - Matplotlib에서 축의 한계를 설정하는 방법

 - 목록에서 matplotlib 자동 y 틱 값 가져 오기

 

Comments