기록하는삶

[파이썬/python] seaborn 그래프 기본 설정(한글깨짐 해결, 축 눈금 기울이기, 그래프 여러 개 한 번에 그리기) 본문

AI/파이썬(Python)

[파이썬/python] seaborn 그래프 기본 설정(한글깨짐 해결, 축 눈금 기울이기, 그래프 여러 개 한 번에 그리기)

mingchin 2021. 9. 22. 00:39
728x90
반응형

1) 폰트 설정, 축 이름 한글화 가능하게, 스타일(darkgrid) 설정

import seaborn as sns
import matplotlib.pyplot as plt

plt.rc("font", family = "Malgun Gothic")
sns.set(font="Malgun Gothic", 
rc={"axes.unicode_minus":False}, style='white')

2) 그래프 사이즈 설정

숫자를 바꿔가며 크기 조정 가능

# 그래프 사이즈 설정
plt.figure(figsize=(10, 7))

#또는
fig.set_size_inches(16,8)

3) x축, y축 설정

 

그래프에 대해 직접 설정하거나, plt.show()를 통해 그래프를 그리기 전에 축 정보를 설정할 수 있다.

이때 rotation = (각도)를 이용하면 눈금 이름을 기울일 수 있다.

# x축의 라벨링 없애기
[그래프명].set(xticklabels=[])

# 축 눈금, 이름 따로 설정하기
plt.xticks(ticks=[눈금 간격], labels=[눈금명], rotation=45)
plt.xlabel([x축 이름], fontsize=20)

4) 여러 그래프 한 번에 그리기

몇 개의 그래프를 그릴 지(m*n) 먼저 설정한 뒤, 각각의 그래프를 정의할 때 그 위치를 'ax=(축)[위치1][위치2]'로 지정해주면 된다.

# 2*2 개의 그래프 그리기
fig, ax = plt.subplots(nrows=2, ncols=2)
fig.set_size_inches(16,8)

# 각 그래프 정의 및 위치 지정
g_date1 = sns.lineplot(x=df['일자'], y=df["휴가자수"], ax=ax[0][0])
g_date2 = sns.lineplot(x=df['일자'], y=df['출장자수'], ax=ax[0][1])
g_date3 = sns.lineplot(x=df['일자'], y=df["시간외근무명령서승인건수"], ax=ax[1][0])
g_date4 = sns.lineplot(x=df['일자'], y=df['재택근무자수'], ax=ax[1][1])

plt.show()

(예시)

보스턴 데이터를 이용, iterator에서 항목의 인덱스와 항목을 튜플 형태로 반환하는 enumerate를 적절히 이용하면, 한 번에 여러 개의 그래프를 그려낼 수도 있다.

# 데이터 로드 및 준비
boston = load_boston()
bostonDF = pd.DataFrame(boston.data , columns = boston.feature_names)
bostonDF['PRICE'] = boston.target


# enumerate와 for문을 이용해 한 번에 여러 그래프 그리기
fig, axs = plt.subplots(figsize=(16,8) , ncols=4 , nrows=2)
lm_features = ['RM','ZN','INDUS','NOX','AGE','PTRATIO','LSTAT','RAD']
for i , feature in enumerate(lm_features):
	row = int(i/4)
	col = i%4
	sns.regplot(x=feature , y='PRICE',data=bostonDF , ax=axs[row][col])

(예시)

if 문을 통해 반복해서 그리면서, 특정 부분에만 변화를 주는 것도 가능하다.

plt.figure(figsize=(20, 7))
xs = Korea['관찰일자'].tolist()
cnt = 0

# 이때 세 자리 숫자는 각각 [row/col/index]를 의미,
# 즉 152 = 하나의 row에 5개 col의 그래프 중 2번째 그래프
for i in range(151,156):
      plt.subplot(i)
            if(cnt == 4):
            # 마지막 그래프만 'red'로 강조
            plt.plot(X[cnt]['관찰일자'],X[cnt]['일별 확진자'],'r')
            plt.xticks(ticks=xs, labels=xs, rotation=45)
            plt.xlabel('{} 일별 확진자 수'.format(Y[cnt]),fontsize=20)
            plt.locator_params(axis='x', nbins=len(xs)/60)
            break;

      plt.plot(X[cnt]['관찰일자'],X[cnt]['일별 확진자'])
      plt.xticks(ticks=xs, labels=xs, rotation=45)
      plt.xlabel('{} 일별 확진자 수'.format(Y[cnt]),fontsize=20)
      plt.locator_params(axis='x', nbins=len(xs)/60)
      cnt += 1

(예시)

 

아래처럼 크기가 다르게 그리는 것도 가능하다.

plt.figure(figsize = (10,10))
plt.subplot(221)


sns.countplot(x = [항목1], order=[항목 순서1])
plt.title('이름1')
plt.subplot(222)

sns.countplot(x = [항목2], order=[항목 순서2])
plt.title('이름2')
plt.subplot(212)

sns.countplot(x = [항목2], order=[항목 순서2])
plt.title('이름3')

plt.show()

(예시)

외에도 matplotlib의 내장모듈인 GridSpec을 이용하면 다양한 표현이 가능하다. 전체 도화지를 m*n으로 나눈 뒤, 일정 부분을 범위로 할당하는 방법이다.

from matplotlib.pyplot import figure as fig
import matplotlib.gridspec as gridspec
import seaborn as sns

plt.rcParams["figure.figsize"] = (20,10) # 사이즈 설정
gs = gridspec.GridSpec(2, 2) # 도화지 나누기

plt.subplot(gs[0, :]) # row 0에 col 1,2 모두 할당
sns.barplot(x=df_train['요일'], y=df_train['출장자수'])

plt.subplot(gs[1, 0]) # row 0, col 1
sns.barplot(x=df_train['요일'], y=df_train["시간외근무"])

plt.subplot(gs[1, 1]) # row 1, span all columns
g_day_of_week5 = sns.barplot(x=df_train['요일'], y=df_train['재택근무자수'])

(예시)

 

728x90
반응형