본문 바로가기
데이터 분석/시각화

[히스토그램(Histogram)] 1. Matplotlib을 이용하여 히스토그램 그리기.

by 부자 꽁냥이 2021. 1. 11.

안녕하세요~ 꽁냥이에요.

 

히스토그램(Histogram)은 수치형 데이터의 분포를 시각적으로 표현해주는 고마운 친구인데요. 이번 포스팅에서는 Matplotlib을 이용하여 히스토그램을 그려보는 방법에 대해서 알아보겠습니다. 여기서 다루는 내용은 다음과 같습니다.

 

1. 기본 히스토그램 그리기

2. 히스토그램 꾸미기


   1. 기본 히스토그램 그리기

Matplotlib에서는 hist를 이용하여 히스토그램을 그릴 수 있습니다. hist의 기본적인 사용법은 다음과 같습니다.


hist( x, bins , density=False, . . . )


x는 히스토그램을 그릴 데이터 배열, bins는 막대기 수, density는 False인 경우 y축을 도수로, True인 경우 y축을 비율로 표시합니다. 코드를 통하여 확인해볼까요?

 

import numpy as np
import matplotlib.pyplot as plt

mu, sigma = 5, 1
x = mu + sigma * np.random.randn(1000)

fig = plt.figure(figsize=(8,8)) ## 캔버스 생성
fig.set_facecolor('white') ## 배경색 설정

plt.hist(x, 20) ## 히스토그램

plt.title('Histogram')
plt.show()

 

line 4~5

히스토그램을 그릴 데이터를 생성합니다. 평균이 5, 분산이 1인 정규분포 샘플을 뽑아주었습니다.

 

lline 10

hist에 위에서 만든 샘플과 막대기 수를 인자로 넣어줍니다. 

 

위 코드를 실행하면 아래와 같이 히스토그램이 잘 그려지는 것을 확인할 수 있습니다.

 


   2. 히스토그램 꾸미기

hist에서는 히스토그램을 꾸밀 수 있는 인자를 기본적으로 제공하고 있습니다. 히스토그램의 막대 색상은 color, 테두리 색상은 edgecolor로 지정할 수 있습니다. 꽁냥이는 히스토그램의 색상은 초록색으로하고 검정 테두리가 표시되도록 했습니다.

 

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(101)
mu, sigma = 5, 1
x = mu + sigma * np.random.randn(1000)

fig = plt.figure(figsize=(8,8)) ## 캔버스 생성
fig.set_facecolor('white') ## 배경색 설정

plt.hist(x, 20, color='y', edgecolor='k') ## 히스토그램

plt.title('Histogram')
plt.show()

 

 

또한 histtype를 통해 히스토그램의 유형을 지정할 수 있습니다. histtype에 들어갈 수 있는 값은 'bar', 'barstacked', 'step', 'stepfilled'이며 기본 설정값은 'bar'입니다. 

 

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(101)
mu, sigma = 5, 1
x = mu + sigma * np.random.randn(1000)

fig = plt.figure(figsize=(8,8)) ## 캔버스 생성
fig.set_facecolor('white') ## 배경색 설정

plt.hist(x, 20, histtype='bar', color='g', edgecolor='k') ## 히스토그램

plt.title('Histogram')
plt.show()

 

 

아래 그림은 histtype가 각각 'barstacked', 'step', 'stepfilled'인 경우를 나타낸 것입니다.

 

 

'barstacked'는 여러 데이터 배열에 대하여 스택 히스토그램을 그릴 때 사용되므로 데이터 배열이 1개인 경우에는 'bar'와 똑같이 동작합니다. 'step'인 경우에는 히스토그램 색상을 지정했다하더라도 하얗게 표시됩니다. 

 

이번엔 일종의 특별편인데요~!! 히스토그램에 그라디언트를 입혀보겠습니다. 먼저 색상을 골라줍니다. 색상은 구글에 'pick color'를 검색하면 맨위에 색상을 선택할 수 있는 화면이 나옵니다.

 

 

이때 빨간 네모안에 hsv 숫자를 기억해야합니다. 여기서 h=31, s=95, v=97이 됩니다. s는 사용하지 않을 것이므로 생략해도 됩니다. 

 

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcl
from matplotlib.colors import LinearSegmentedColormap

np.random.seed(101)
mu, sigma = 5, 1
x = mu + sigma * np.random.randn(1000)

fig = plt.figure(figsize=(8,8)) ## 캔버스 생성
fig.set_facecolor('white') ## 배경색 설정

_, bins, patches = plt.hist(x, 20) ## 히스토그램


bin_centers = 0.5*(bins[:-1]+bins[1:]) ## 막대의 위치에 따라서 색 그라디언트를 입힌다.

## 막대의 위치를 0~1로 만들어준다.
col = bin_centers - min(bin_centers) 
col /= max(col) 

## hsv 색상을 선택한다.
h = 31
v = 97
## hsv 색상을 rgb 색상으로 바꿔준다.
cv = [mcl.hsv_to_rgb((h*1/(2*180),0.2,v/100)),
      mcl.hsv_to_rgb((h*1/(2*180),1,v/100)),
      mcl.hsv_to_rgb((h*1/(2*180),0.2,v/100))]

cmap=LinearSegmentedColormap.from_list('field_cmap', cv, N=256,gamma=1)

for c, p in zip(col, patches):
    plt.setp(p, "facecolor", cmap(c))

plt.title(f'Histogram',fontsize=20)
plt.show()

 

line 23~24

앞서 선택했던 h와 v값을 지정합니다.

 

line 26~28

matplotlib은 hsv 색상을 인식하지 못합니다. 따라서 rgb로 바꾸어주어야합니다. 색상의 투명도는 s값을 이용하여 조절할 수 있습니다. s는 0~1의 값을 가지면 숫자가 커질수록 진해지고 작을 수록 투명해집니다. 꽁냥이는 히스토그램의 중앙에서 바깥으로 갈수록 밝게하려고 하므로 중앙 s값은 1로 좌우 바깥쪽에 대한 s값은 0.2로 설정하였습니다.

 

line 30

color map을 만들어줍니다. 

 

line 32~33

히스토그램에서 각 막대 위치에 대응하는 색상으로 지정해줍니다.

 

코드를 실행해보세요.

 

 

히스토그램에 그라디언트가 예쁘게 적용되었습니다. 짝짝~!!


이번 포스팅에서는 기본적인 히스토그램을 그리는 방법과 꾸미는 방법에 대하여 알아보았습니다. 다음 포스팅에서는 여러개 히스토그램을 그리는 방법에 대하여 알아보겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다. 안녕히 계세요~!!

 


댓글


맨 위로