본문 바로가기
self.python

[python] seaborn으로 HeatMap 그리기 - 1

by 톤토니 2022. 11. 6.
반응형

히트맵

[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)

 

실행 화면 1

 

 

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

 

 

 

2) 그 다음으로 색깔을 바꾸고 싶다면 다른 그래프와 마찬가지로 cmap으로 바꿀 수 있다.

 

fig, ax = plt.subplots(1, 1, figsize=(8,5), sharey=True)

sns.heatmap(df,
            cmap = 'Greys') # 색상 변경

실행화면 3

 

무난하게 Greys를 많이 쓰는 편이다. 아까보다 훨씬 깔끔해진 느낌이 난다.

그리고 진해질 수록 사람들이 많이 이용하는 그래프가 되어 훨씬 알아보기 쉬워졌다.

 

* 아래 링크를 타고 들어가면 더 많은 색상을 확인할 수 있다. 

https://matplotlib.org/stable/tutorials/colors/colormaps.html

 

Choosing Colormaps in Matplotlib — Matplotlib 3.6.2 documentation

Note Click here to download the full example code Choosing Colormaps in Matplotlib Matplotlib has a number of built-in colormaps accessible via matplotlib.colormaps. There are also external libraries that have many extra colormaps, which can be viewed in t

matplotlib.org

 

'Greys' 대신에 'YlGn'을 사용하면 아래와 같이 초록색으로도 나타낼 수 있다. (yellow green?)

실행화면 4

 

 

 

 

 

 

 

3) data 표시하기

 

히트맵에서 아무리 색깔로 데이터의 정도를 표시했다고는 하지만 수치를 같이 기입한다면 보기 더 편하다. anoot = False가 기본 상태이므로 처음 그래프를 그릴 때 아무런 값이 나타나지 않았지만 annot = True로 바꿔주면 데이터가 같이 표시된다.

 

fig, ax = plt.subplots(1, 1, figsize=(8,5), sharey=True)


sns.heatmap(df,
            cmap = 'YlGn', # 색상 변경
            annot = True)  # 숫자 표시 여부

실행화면 5

 

그런데 숫자 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는 소수점 둘째자리까지 표시

실행화면 6

 

 

 

 

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를 더 깔끔하고 보기 쉽게 만들 수 있는 여러가지 옵션이 있는데 그거는 다음에 더 살펴보자.

 

 

 

 

 

 

 

 

반응형

댓글