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

[히트 맵(Heat Map)] 2. 히트 맵 꾸미기

by 부자 꽁냥이 2021. 4. 25.

안녕하세요~ 꽁냥이에요. 저번 포스팅에서는 히트 맵을 그리는 기본적인 방법에 대해서 알아보았는데요. 이번 포스팅에서는 히트 맵을 좀 더 꾸며보는 방법을 알아볼 거예요. 여기서 다루는 내용은 다음과 같아요.

 

1. 히트 맵 색상 바꾸기

2. 히트 맵 텍스트 추가하기


   1. 히트 맵 색상 바꾸기

먼저 이번 포스팅에서 필요한 모듈을 임포트해주세요.

 

import matplotlib.pyplot as plt
import matplotlib.colors as mcl
import seaborn as sns

import numpy as np
import pandas as pd

from matplotlib.colors import LinearSegmentedColormap

 

그리고 히트 맵을 그릴 데이터를 생성해줍니다~~

 

## 데이터 생성데이터 생성
np.random.seed(5)
columns = ['X' + str(x).zfill(2) for x in range(10)]

data = {}
for k in columns:
    data[k] = [0]*20

map_df = pd.DataFrame(data)
map_df.index = ['Y' + str(x).zfill(2) for x in range(20)]

for i in range(map_df.shape[0]):
    for j in range(map_df.shape[1]):
        map_df.iloc[i,j] = np.random.randn(1)
반응형

1. 사전의 정의된 컬러맵 이용하기

1) Matplotlib

히트 맵의 색상은 컬러맵을 이용하여 바꿔주는데요. Matplotlib에서는 사전에 정의된 컬러맵이 많은데 이에 대한 내용은 아래 박스를 클릭하셔서 확인해볼 수 있어요.

 

 

Choosing Colormaps in Matplotlib — Matplotlib 3.4.1 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.cm.get_cmap. There are also external libraries like [palettable] and [colorcet] that have many extra

matplotlib.org

 

박스를 클릭하셔서 해당 사이트로 들어가면 여러가지 사전에 정의된 컬러맵을 볼 수 있는데요. 꽁냥이는 그중에서 Reds를 사용하려고 해요.

 

히트 맵의 색상을 바꾸기 위해선 pcolor의 cmap인자를 사용해야되요. 사용법은 아래 코드를 보면서 확인해볼게요.

 

## Matplotlib
fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')

plt.pcolor(map_df.values,cmap='Reds')
plt.xticks(range(len(map_df.columns)),map_df.columns) ## x축 눈금 생성
plt.yticks(range(len(map_df.index)), map_df.index) ## y축 눈금 생성

plt.colorbar()
plt.show()

 

line 5

cmap 인자에 앞서 살펴보았던 Reds를 넣어주면 됩니다.

 

위 코드를 실행하시면 아래와 같이 색상이 변경 된 것을 알 수 있습니다.

 

 

2) Seaborn

Seaborn에서도 heatmap의 cmap인자를 이용하여 히트 맵 색상을 바꿀 수 있습니다. 아래 코드는 Seaborn을 이용한 히트 맵을 그리는 코드예요. Matplotlib과의 차이점은 colorbar를 사용하지 않는다는 점이에요. 

 

## seaborn
fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')

sns.heatmap(map_df,cmap='Reds')
plt.xticks(range(len(map_df.columns)),map_df.columns) ## x축 눈금 생성
plt.yticks(range(len(map_df.index)), map_df.index) ## y축 눈금 생성

plt.show()

 

위 코드를 실행하면  앞서 본 것과 거의 동일한 히트 맵이 그려지는 것을 알 수 있어요. Seaborn은 위에서 아래로 Matplotlib은 아래서부터 위로 그려지는 차이점이 있어요.

 

 

 

2. 내가 원하는 색상 이용하기

그렇다면 사전에 정의된 컬러맵 이외에 내가 사용하고 싶은 컬러맵을 이용할 수 없는 걸까요? 아닙니다. 사용할 수 있어요. 

 

먼저 구글에 'color picker'를 검색하면 색상을 선택할 수 있는 곳이 나와요. 여기에서 자기가 원하는 색상을 찍어주면 아래에 RGB, HSV 등 여러 가지 값이 자동으로 생성됩니다. 이때 HSV 값을 잘 기억해주세요. 저는 주황색을 선택했고 이에 해당하는 HSV 값이 각각 24도, 99%, 100%입니다.

 

 

이를 히트 맵에 적용시켜 보도록 하겠습니다. 아래 코드를 살펴볼게요. 

 

h = 24
s = 0.99
v = 1

colors = [
    mcl.hsv_to_rgb((h/360,0,v)),
    mcl.hsv_to_rgb((h/360,0.5,v)),
    mcl.hsv_to_rgb((h/360,1,v))
]
cmap = LinearSegmentedColormap.from_list('my_cmap',colors,gamma=3)

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')

plt.pcolor(map_df.values,cmap=cmap)
plt.xticks(range(len(map_df.columns)),map_df.columns) ## x축 눈금 생성
plt.yticks(range(len(map_df.index)), map_df.index) ## y축 눈금 생성

plt.colorbar()
plt.show()

 

line 1~3

자기가 원하는 색상에 대한 HSV 값을 각각 h, s, v라는 변수에 넣어주었습니다.

 

line 5~10

자기가 원하는 색상을 이용하여 컬러맵을 만들어주는 코드입니다. 간단히 설명하면 색상을 하얀색, 그리고 하얀색과 자기가 선택한 색상의 중간색, 그리고 내가 선택한 색 이렇게 분리해서 그라디언트를 만들어 주는 것입니다. 지금은 이 정도 까지만 알아두세요. 컬러맵에 대한 내용은 추후 포스팅하겠습니다.

 

line 15

앞에서 만든 컬러맵을 cmap인자에 넣어줍니다.

 

위 코드를 실행해보세요.

 

 

이렇게 만든 컬러맵은 Seaborn에서도 사용할 수 있어요. 아래와 같이 말이죠.

 

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')

sns.heatmap(map_df.values,cmap=cmap)
plt.xticks(range(len(map_df.columns)),map_df.columns) ## x축 눈금 생성
plt.yticks(range(len(map_df.index)), map_df.index) ## y축 눈금 생성

plt.show()

 


   2. 히트 맵 텍스트 추가하기

1. Matplotlib

이번엔 히트 맵에 각 셀마다 해당 값을 출력해보도록 할 거예요. 이를 위한 코드가 다음과 같아요.

 

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')

plt.pcolor(map_df.values,cmap=cmap)

for i in range(map_df.shape[1]):
    for j in range(map_df.shape[0]):
        plt.text(i+0.5,j+0.5,round(map_df.iloc[j,i],2),ha='center',va='center')

plt.xticks(range(len(map_df.columns)),map_df.columns) ## x축 눈금 생성
plt.yticks(range(len(map_df.index)), map_df.index) ## y축 눈금 생성

plt.colorbar()
plt.show()

 

line 6~8

텍스트를 출력하기 위해선 text를 이용하여 하나씩 생성해줘야해요. 이때 x좌표, y좌표에 0.5를 추가하고 ha, va를 모두 'center'로 지정해주세요. 텍스트를 셀 중앙에 배치하기 위한 것이랍니다.

 

위 코드를 수행하면 아래와 같이 텍스트가 잘 출력 되어 나온 것을 확인할 수 있어요.

 

 

2. Seaborn

Seaborn에서는 heatmap에 annot인자를 True로 지정해주면 쉽게 텍스트를 추가할 수 있어요.

 

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')

round_func = np.vectorize(lambda x:round(x,2))
sns.heatmap(round_func(map_df.values),cmap=cmap,annot=True)

plt.xticks(range(len(map_df.columns)),map_df.columns) ## x축 눈금 생성
plt.yticks(range(len(map_df.index)), map_df.index) ## y축 눈금 생성

plt.show()

 

 

Seaborn은 셀의 색상에 따라서 보는 사람의 편의를 생각해서 텍스트의 색상을 자동으로 바꿔줘요. 정말 기특한 친구네요~>0<


이번 포스팅에서는 히트 맵을 좀 더 꾸며보는 방법에 대해서 알아보았어요. 궁금하신 것은 댓글로 남겨주세요. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다. 안녕히 계세요.

 


댓글


맨 위로