Python 연습장
Python Visualization(4) - subplot 본문
만약 그려야할 그래프의 개수가 정해져 있는 게 아니라 그때 그때 데이터셋에 따라 달라진다면 subplot을 어떻게 그려야할까?
k값에 따라 달라지는 subplot layout 을 그리는 함수를 만들어보자.
먼저 import matplotlib.pyplot as plt 로 먼저 matplotlib 을 import 해준다.
함수에 들어가야할 인수는 그려야할 데이터가 들어있는 dataframe df와 행의 개수인 col_num 이렇게 두가지다.
k값(그려야할 subplot 의 total 숫자)은 df의 column 개수로 정의한다.
col_num 은 사용자 지정 숫자로 임의로 입력해줘야 한다.
다음 def make_subplot_layout(df, col_num) 이라고 함수를 선언해주고 함수에 들어갈 내용을 입력해준다.
이 때 plt.subplot 에는 행개수,열개수,n번째 의 인수가 들어가야한다.
>> plt.suplot(행개수,열개수,n번째)
그래서 nrows 와 ncols 에 들어갈 행,열의 숫자를 지정해줘야하는데 col_num 으로 이미 ncols 의 숫자는 알고있고, nrows 의 숫자는 계산을 따로 해준다.
k가 6이고 col_num이 3이면 6/3 = 2 로 2행 3열로 나타내면 된다. 그런데 k가 7이라면?
7/3 = 2.33.. 이므로 반올림을 해줘야 하는데, 반올림은 math 모듈에서 ceil 함수를 불러와서 해줄 수 있다. (반대로 내림은 floor 함수다)
row_num = math.ceil(k/col_num) 으로 정의해줄 수 있다.
다음 subplot 하나마다 그래프를 그려줘야하는데 for 문을 이용해서 i번째 해당하는 subplot을 그려준다. 총 k개의 그래프를 그려야하니까 k for range 문에서 range는 k다.
여기서 주의해야할 점은 range(k)로 for 문을 만들면 0부터 시작하게 되는데 subplot은 0번째부터 시작할 수 없고 무조건 1번째부터 시작이므로 for문 인수에 1만큼을 더해줘야 한다. plt.subplot(row_num,col_num,i+1) 로 나타내야 한다.
그럼 코드에 모아서 살펴보자.
import matplotlib.pyplot as plt
import math
def make_subplot_layout(df,col_num) :
k = len(df.columns)
row_num = math.ceil(k/col_num)
for i in range(k) :
plt.subplot(row_num,col_num,i+1) # 꼭 +1 을 붙여줘야한다.
plt.plot(df.iloc[:,i])
plt.tight_layout() # plt.show() 앞에는 항상 tight_layout()을 붙여주자
plt.show()
실제로 데이터를 불러와서 그려보자.
이전 포스팅에서는 iris target 을 따로 지정해줬지만 오늘은 각 속성별로 그래프만 그릴거니까 target 정의 부분은 비활성화 했다.
각 subplot 이 무엇을 나타내는지 알려주기 위해서 subplot별로 title을 추가했다.
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import math
iris = load_iris()
df = pd.DataFrame(data = iris.data, columns = iris.feature_names)
# df['target'] = iris.target_names[iris.target]
print(df)
def make_subplot_layout(df,col_num) :
k = len(df.columns)
row_num = math.ceil(k/col_num)
for i in range(k) :
plt.subplot(row_num,col_num,i+1) # 꼭 +1 을 붙여줘야한다.
plt.hist(df.iloc[:,i])
plt.title(df.columns[i])
plt.tight_layout()
plt.show()
make_subplot_layout(df, 3)
make_subplot_layout(df, 4)
make_subplot_layout(df, 2)
얼추 그려지긴 했는데, 두번째 그래프를 보면 길이랑 너비 조정이 필요해보인다. figsize 를 조정해보자.
이 그래프는 4:3 정도되면 보기 좋을 것 같다. 열의 개수에 맞춰서 조정해보자.
plt.figure(figsize=(x폭,y폭)) 으로 figure size 를 정의해주면 되는데 subplot의 행 개수와 열 개수에 맞춰서 그려주면 된다.
다만 이 때 주의해야 할 점은, subplot처럼 행(y),열(x) 순서가 아니라 x, y 순서라는 것이다.
그래서 row_num, col_num 순서를 반대로 figsize = (col_num, row_num) 으로 입력해줘야 한다. 여기서 비율은 내맘대로 4:3으로 해서 각각에 곱해줬다.
>> plt.figure(figsize=(col_num*4, row_num*3))
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import math
iris = load_iris()
df = pd.DataFrame(data = iris.data, columns = iris.feature_names)
def make_subplot_layout(df,col_num) :
k = len(df.columns)
row_num = math.ceil(k/col_num)
plt.figure(figsize=(col_num*4,row_num*3))
for i in range(k) :
plt.subplot(row_num,col_num,i+1) # 꼭 +1 을 붙여줘야한다.
plt.hist(df.iloc[:,i])
plt.title(df.columns[i])
plt.tight_layout()
plt.show()
make_subplot_layout(df, 4)
아까보다 훨씬 보기 좋아졌다.
오늘은 subplot을 열 개수에 맞추어 그리는 방법을 설명해봤다. 내가 가끔 사용할 일이 있어서 정리해봤는데 다른 분들께도 도움이 되었으면 한다.
'코딩' 카테고리의 다른 글
Python Visualization(5) - seaborn (0) | 2022.01.10 |
---|---|
pipeline (0) | 2022.01.09 |
Python Visualization(3) - matplotlib의 그래프 종류 (0) | 2022.01.04 |
Python Visualization(2) - matplotlib 기본 (0) | 2022.01.03 |
딥러닝 시계열 알고리즘 정리 (0) | 2022.01.01 |