[Python] 여러개의 그룹, 변수로 히스토그램, 커널밀도곡선 그리기 (Multiple histograms)
Python 분석과 프로그래밍/Python 그래프_시각화 2018. 12. 28. 12:10지난번 포스팅에서는 하나의 그룹, 하나의 변수에 대한 히스토그램, 커널밀도곡선을 그리는 방법을 소개하였습니다.
이번 포스팅에서는
(1) 여러개의 그룹에 대한 히스토그램, 커널밀도곡선 그리기
(2) 여러개의 변수에 대한 히스토그램, 커널밀도곡선 그리기
에 대해서 알아보겠습니다.
먼저, matlplotlib.pyplot, seaborn 패키지를 importing하고, 예제로 사용할 iris 데이터셋을 불러오겠습니다.
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # loading 'iris' dataset iris = sns.load_dataset('iris') iris.shape (150, 5) iris.head()
iris.groupby('species').size() species
setosa 50
versicolor 50
virginica 50
dtype: int64 |
iris는 붓꽃인데요, 아래처럼 versicolor, setosa, virginica의 3개 종(species) 그룹별로 각 50개씩 꽃잎 길이와 넓이, 꽃받침 길이와 넓이의 4개 변수를 측정한 데이터셋입니다.
* image source: https://www.datacamp.com/community/tutorials/machine-learning-in-r
(1) 여러개 그룹의 히스토그램, 커널밀도곡선 그리기 |
petal_length 변수에 대해서 setosa, versicolor, virginica 종의 3개 그룹(groups)의 히스토그램과 커널밀도곡선을 그룹별로 색깔을 다르게 하여 그려보겠습니다.
# 1-1. Multiple histograms on the same axis sns.distplot(iris[iris.species == "setosa"]["petal_length"], color="blue", label="setosa") sns.distplot(iris[iris.species == "versicolor"]["petal_length"], color="red", label="versicolor") sns.distplot(iris[iris.species == "virginica"]["petal_length"], color="green", label="virginica") plt.legend(title="Species") plt.show()
|
만약 그룹 개수가 많아서 위에서처럼 일일이 코딩하기가 시간이 오래걸리고 반복되는 코드가 길게 늘어서는게 싫다면 아래처럼 for loop 을 사용해주면 됩니다.
그래프의 제목, X축 이름, Y축 이름, 범례 이름을 설정하는 방법도 같이 소개합니다.
# 1-2. Via for loop grp_col_dict = {'setosa': 'blue', 'versicolor': 'red', 'virginica': 'green'} # for loop of species group for group in grp_col_dict:
# subset of group subset = iris[iris['species'] == group]
# histogram and kernel density curve sns.distplot(subset['petal_length'], hist = True, # histogram kde = True, # density curve kde_kws = {'linewidth': 2}, color = grp_col_dict[group], label = group) # setting plot format plt.title('Histogram & Density Plot by Groups') plt.xlabel('Petal Length(unit:cm)') plt.ylabel('Density') plt.legend(prop={'size': 12}, title = 'Group') plt.show() |
(2) 여러개 변수의 히스토그램, 커널밀도곡선 그리기 |
이번에는 sepal_width, sepal_length, petal_width, petal_length 의 4개 변수(variable)에 대해서 히스토그램과 커널밀도곡선을 그려보겠습니다. (단, 종(species)의 구분없이 전체 사용)
for loop 을 사용하였는데요, 위의 그룹 indexing 과 이번의 변수 indexing 부분이 다르다는 점 유심히 살펴보시기 바랍니다.
# 2-1. Multiple histograms on the same axis var_color_dict = {'sepal_length': 'blue', 'sepal_width': 'red', 'petal_length': 'yellow', 'petal_width': 'green'} # for loop for var in var_color_dict: sns.distplot(iris[var], color = var_color_dict[var], hist_kws = {'edgecolor': 'gray'}, label = var) plt.legend(title = 'Variables') plt.show() |
위의 (2-1) 그래프는 1개의 window에 동일한 축을 사용하여 4개 변수의 히스토그램과 밀도곡선을 그리다보니 중첩이 되면서 좀 헷갈리고 보기에 어려운 점이 있습니다.
이런 경우에 그래프를 각 변수별로 분리해서 4개의 window subplots에 하나씩 그려서 비교하는 것도 좋은 방법입니다. ax=axes[0, 0] 은 좌상, ax=axes[0, 1]은 우상, ax=axes[1, 0]은 좌하, ax=axes[1, 1]은 우하 위치의 subplot 입니다.
# 2-2. Multiple histograms at separate windows f, axes = plt.subplots(2, 2, figsize=(8, 6), sharex=True) sns.distplot(iris["sepal_length"], color="blue", ax=axes[0, 0]) sns.distplot(iris["sepal_width"], color="red", ax=axes[0, 1]) sns.distplot(iris["petal_length"], color="yellow", ax=axes[1, 0]) sns.distplot(iris["petal_width"], color="green", ax=axes[1, 1]) plt.show() |
for loop을 사용해서 그리려면 아래 코드를 참고하세요.
var_color_dict = {'sepal_length': 'blue', 'sepal_width': 'red', 'petal_length': 'yellow', 'petal_width': 'green'} i = [0, 0, 1, 1] j = [0, 1, 0, 1] # for loop f, axes = plt.subplots(2, 2, figsize=(8, 6), sharex=True) for var, i, j in zip(var_color_dict, i, j): sns.distplot(iris[var], color = var_color_dict[var], ax = axes[i, j])
plt.show() |
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)
'Python 분석과 프로그래밍 > Python 그래프_시각화' 카테고리의 다른 글
[Python] 산점도 그래프 (Scatter Plot) (1/4) (0) | 2019.01.13 |
---|---|
[Python] 원 그래프 (Pie Chart), 하위 그룹을 포함한 도넛 그래프 (Donut Chart with Subgroups) (1) | 2019.01.12 |
[Python] 막대 그래프 (Bar Chart) (7) | 2019.01.11 |
[Python] 상자 그림 (Box plot, Box-and-Whisker Plot) (2) | 2019.01.08 |
[Python] 하나의 변수/그룹에 대한 히스토그램 (Histogram) (0) | 2018.12.27 |