[python] seaborn 으로 HeatMap 그리기
Heatmap은 열을 뜻하는 히트와 지도를 뜻하는 맵을 결합시킨 그래프로 3차원 데이터를 2차원의 보기 쉬운 형태로 나타낼 수 있다. 값의 크거나 낮음을 한 눈에 알아보기 쉽고, 어디에 집중되어 있는지 파악하기 쉽다.
행과 열이 되는 데이터는 보통 명목변수나 이산형 변수가 많이 쓰이고 색상으로 표현할 수 있는 데이터는 연속형도 가능하다. (* 행과 열이 연속형이라면 등고선도(contour)로 표현하는 것이 더 좋다)
1. 라이브러리 import
먼저 파이썬에서 히트맵 그래프를 그리기 위해 필요한 라이브러리를 import하고 예시로 사용할만한 임의의 데이터 프레임도 만들어 보았다.
import numpy as np # 행렬 사용하기 위해서
import pandas as pd # 데이터 프레임 사용하기 위해서
import matplotlib.pyplot as plt # 그래프 그리기
import seaborn as sns # 히트맵 사용
score = {'Subject' : ['A city', 'B city', 'C city', 'D city', 'E city'],
'Bus': [80, 92, 68, 78, 100],
'Subway': [90, 68, 70, 80, 88],
'car': [39, 59, 60, 73, 90],
'bicycle': [83, 92, 71, 56, 0]}
df = pd.DataFrame(score)
df.set_index(keys=['Subject'], inplace=True, drop=True)
df
각 도시에서 사람들이 어떤 교통수단을 이용하는지에 대한 임의의 데이터 프레임이 있다고 하자.
이런 경우의 데이터를 히트맵으로 표현하면 어느 지역에서 버스를 가장 많이 이용하는지, 자동차가 가장많은 도시는 어디인지 등의 정보를 한 번에 알 수 있을것이다.
2-1. 그래프 그리기
sns.heatmap(df)
Seaborn 패키지의 heatmap 함수에서 데이터 프레임을 넣어주기만 하면 간단하게 바로 HeatMap을 그릴 수 있다.
오른쪽의 Color Bar도 함께 표시되어 진한색에서 밝은 색으로 갈수록 점수가 더 높다는 것을 알 수 있다.
하지만 보통 많이 사용하면 점점 색깔이 진해지는게 히트맵의 경우 훨씬 알아보기 쉬운 그래프라고 생각한다.
옆에 color bar를 안보고 그래프만 본다면 A 도시에서는 자동차를 많이 이용하는구나, 라고 생각할 수도 있다.
몇 개의 함수들을 이용하여 좀 더 한 번에 알아보기 쉬운 그래프로 만들어 보자.
2-2. 그래프 조절하기
1) 그래프 크기를 조정하고 싶다면 subplots으로 figsize를 설정할 수 있다.
fig, ax = plt.subplots(1, 1, figsize=(8,5)) #그래프 크기 조정
sns.heatmap(df)
2) 그 다음으로 색깔을 바꾸고 싶다면 다른 그래프와 마찬가지로 cmap으로 바꿀 수 있다.
fig, ax = plt.subplots(1, 1, figsize=(8,5), sharey=True)
sns.heatmap(df,
cmap = 'Greys') # 색상 변경
무난하게 Greys를 많이 쓰는 편이다. 아까보다 훨씬 깔끔해진 느낌이 난다.
그리고 진해질 수록 사람들이 많이 이용하는 그래프가 되어 훨씬 알아보기 쉬워졌다.
* 아래 링크를 타고 들어가면 더 많은 색상을 확인할 수 있다.
https://matplotlib.org/stable/tutorials/colors/colormaps.html
'Greys' 대신에 'YlGn'을 사용하면 아래와 같이 초록색으로도 나타낼 수 있다. (yellow green?)
3) data 표시하기
히트맵에서 아무리 색깔로 데이터의 정도를 표시했다고는 하지만 수치를 같이 기입한다면 보기 더 편하다. anoot = False가 기본 상태이므로 처음 그래프를 그릴 때 아무런 값이 나타나지 않았지만 annot = True로 바꿔주면 데이터가 같이 표시된다.
fig, ax = plt.subplots(1, 1, figsize=(8,5), sharey=True)
sns.heatmap(df,
cmap = 'YlGn', # 색상 변경
annot = True) # 숫자 표시 여부
그런데 숫자 100이 1e+02 로 과학적 표기법으로 나타나진 것을 볼 수 있다.
이런 숫자의 형태를 정수나, 소수점 n 번째 자리까지 표현하고 싶다면 fmt 으로 조절할 수 있다.
파이썬의 문자열 포맷팅과 같이 d는 정수, .1f는 소수점 한자리까지, .2f는 두자리까지 표현 가능하다.
fig, ax = plt.subplots(1, 1, figsize=(8,5), sharey=True)
sns.heatmap(df,
cmap = 'YlGn', # 색상 변경
annot = True, # 숫자 표시 여부
fmt = 'd') # d는 정수, .2f는 소수점 둘째자리까지 표시
3. 총 정리
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
score = {'Subject' : ['A city', 'B city', 'C city', 'D city', 'E city'],
'Bus': [80, 92, 68, 78, 100],
'Subway': [90, 68, 70, 80, 88],
'car': [39, 59, 60, 73, 90],
'bicycle': [83, 92, 71, 56, 0]}
df = pd.DataFrame(score)
df.set_index(keys=['Subject'], inplace=True, drop=True)
fig, ax = plt.subplots(1, 1, figsize=(8,5), sharey=True)
sns.heatmap(df,
cmap = 'YlGn', # 색상 변경
annot = True, # 숫자 표시 여부
fmt = 'd') # d는 정수, .2f는 소수점 둘째자리까지 표시
이렇게 Seaborn에서 제공하는 heatmap 을 이용하여 데이터 프레임을 더 알아보기 쉽게 만드는 방법에 대하여 알아 보았다.
Heatmap를 더 깔끔하고 보기 쉽게 만들 수 있는 여러가지 옵션이 있는데 그거는 다음에 더 살펴보자.
'self.python' 카테고리의 다른 글
[python] 양방향 막대 그래프 그리기 - barh 함수 사용 (0) | 2023.05.20 |
---|---|
[python] seaborn으로 HeatMap 그리기 - 2 (최대값/최소값, Cbar, tick, Label 조절하여 그래프 그리기) (1) | 2022.12.05 |
[python] 데이터 프레임 전처리 - replace 이용하기 (0) | 2022.07.03 |
[python] 숫자 데이터 자리수 맞추어 표시하기(앞에 0 채워주기) - zfill() (0) | 2022.06.27 |
[python] 데이터 프레임 합치기 - concat, append, join (0) | 2022.06.21 |
댓글