Python

[파이썬] 히트맵 그래프, 원하는 색상 설정 - seaborn, matplotlib

weweGH 2025. 4. 2. 09:00
반응형

히트맵 색상 설정
히트맵 색상 설정


히트맵 그래프, 원하는 색상 설정 - sns.heatmap


들어가며


파이썬에서 sns 패키지를 활용하여 히트맵 그래프 그리는 방법을 소개합니다. matplotlib에서 제공하는 컬러맵 외에 특정 값에 대해 특정 색상을 매핑하여 그래프를 그릴 수도 있습니다. seaborn과 matplotlib을 통하여 다양한 옵션을 넣어 원하는 그래프로 시각화를 할 수 있습니다.


  • 데이터 소개
  • 히트맵
  • 히트맵 색상 설정

데이터 소개


이 글에서 활용할 데이터는 도로의 일부 구간에 대하여 특정 시간대별 속도를 나타낸 csv 파일입니다. 아래 파일을 다운로드하여 사용해 보세요.

import pandas as pd

df = pd.read_csv('heatmap_sample.csv', index_col='SECTION_ID')
df.head()

데이터
데이터
heatmap_sample.csv
0.00MB


히트맵


matplotlib에서 제공하는 컬러맵을 활용하여 별도의 색상 지정 없이 편리하게 그래프를 그릴 수 있습니다.


먼저 필요한 패키지인 matplotlib과 seaborn을 import 합니다.

import matplotlib.pyplot as plt
import seaborn as sns

아래 코드의 첫 줄은 그래프의 크기를 설정하는 부분입니다. figsize=(WIDTH, HEIGHT)에 원하는 폭과 높이를 설정합니다. 그리고 sns.heatmap으로 다양한 옵션을 넣습니다. 아래 이미지는 크기를 폭 20, 높이 10으로 설정하고, matplotlib의 컬러맵인 RdYlGn을 활용한 그래프입니다.

fig, ax = plt.subplots(figsize=(20, 10))  # width, height
ax = sns.heatmap(df,
                 cmap = 'RdYlGn', # 색상
                 fmt = 'd', # 'd'는 정수로 표현
                 linewidths = 0.5, # 셀 사이 간격
                 cbar = False, # 컬러바 표시 여부
                 square = True)  # 셀 정사각형 표현 여부

heatmap1
heatmap1


RdYlGn 외에 다양한 색도 가능합니다. PiYG 색상으로 컬러맵을 변경한 그래프입니다.

fig, ax = plt.subplots(figsize=(20, 10))  # width, height
ax = sns.heatmap(df,
                 cmap = 'PiYG', # 색상
                 fmt = 'd', # 'd'는 정수로 표현
                 linewidths = 0.5, # 셀 사이 간격
                 cbar = False, # 컬러바 표시 여부
                 square = True)  # 셀 정사각형 표현 여부

heatmap2
heatmap2


색상 범례를 같이 표현하고 싶다면, cbar 옵션을 True로 변경하고 cbar_kws를 통하여 수직으로 표현할지 수평으로 표현할지 선택합니다.

fig, ax = plt.subplots(figsize=(20, 10))  # width, height
ax = sns.heatmap(df,
                 cmap = 'RdYlGn', # 색상
                 fmt = 'd', # 'd'는 정수로 표현
                 linewidths = 1, # 셀 사이 간격
                 cbar = True, # 컬러바 표시 여부
                 cbar_kws={'orientation': 'horizontal'}, # 컬러바 수평
                 square = True)  # 셀 정사각형 표현 여부

heatmap3
heatmap3


위에서 살펴본 옵션들 외에도 원하는 형태로 그릴 수 있는 다양한 옵션들이 있습니다. seaborn heatmap 사이트를 참고하세요.

반응형

히트맵 색상 설정


matplotlib에서 제공하는 컬러맵을 활용하여 그래프를 그릴 수도 있지만, 설정한 값에 색상을 지정하여 그래프를 그릴 수도 있습니다. 색상을 나타내는 hex code만 있으면 원하는 색상으로 표현할 수 있습니다.


먼저 필요한 패키지인 matplotlib과 seaborn과 색상을 설정할 때 필요한 패키지도 import 합니다.

import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.colors import ListedColormap, BoundaryNorm

색상을 지정하기 위해서는 각각의 색에 대한 hex code가 필요합니다. 여러 사이트를 활용하여 원하는 색상에 대한 헥스 코드를 ListedColormap으로 sel_colmap 변수에 저장합니다. 아래는 속도를 표현하기 위해 17가지의 색상을 선택했습니다.

sel_col = ['#ba001e','#d80019','#f32b1d','#ff502b','#ff7c3c','#ffa84e','#ffcb6c','#ffe992','#fcfeb3','#e4f693','#c6ea74','#a0de5c','#68cb57','#39be56','#00b14d','#00893e','#006b31']
sel_colmap = ListedColormap(sel_col)

색상을 지정했다면 원하는 색상에 대한 값을 리스트로 담고, BoundaryNorm으로 색상과 값을 매핑합니다. 이때, sel_colrs 리스트의 길이와 spd 리스트의 길이는 동일해야 합니다. 아래 코드의 spd는 0km/h부터 160km/h까지 10km/h 단위로 색상을 표현하기 위한 속도 리스트입니다.

sel_norm = list(range(0, 170, 10))
sel_norm = BoundaryNorm(sel_norm, ncolors=len(sel_col))

위의 설정한 색상과 값을 표로 표현하면 다음과 같습니다.

colors
colors


그래프의 크기를 설정하고, 위에서 설정한 색상대로 그래프를 그려보겠습니다.

fig, ax = plt.subplots(figsize=(20, 10)) 
ax = sns.heatmap(df,
    cmap = sel_colmap, # 선택 색상
    norm = sel_norm, # 설정 기준
    cbar = True, # 컬러바 표시 여부
    cbar_kws = {'orientation': 'horizontal'}, # 컬러바 수평
    square = True, # 셀 정사각형 표현 여부
    fmt='d')

heatmap mycolor1
heatmap mycolor1


이번에는 cbar 옵션을 False, annot 옵션을 True로 변경하여 데이터 값을 그래프에 표출해 보겠습니다.

fig, ax = plt.subplots(figsize=(20, 10)) 
ax = sns.heatmap(df,
    cmap = sel_colmap, # 선택 색상
    norm = sel_norm, # 설정 기준
    cbar = False, # 컬러바 표시 여부
    annot = True, # 값 표시 여부
    square = True, # 셀 정사각형 표현 여부
    fmt='d')

heatmap mycolor2
heatmap mycolor2


전체 코드


import pandas as pd

df = pd.read_csv('heatmap_sample.csv', index_col='SECTION_ID')
df.head()

import matplotlib.pyplot as plt
import seaborn as sns

# heatmap1
fig, ax = plt.subplots(figsize=(20, 10))  # width, height
ax = sns.heatmap(df,
                 cmap = 'RdYlGn', # 색상
                 fmt = 'd', # 'd'는 정수로 표현
                 linewidths = 0.5, # 셀 사이 간격
                 cbar = False, # 컬러바 표시 여부
                 square = True)  # 셀 정사각형 표현 여부

# heatmap2
fig, ax = plt.subplots(figsize=(20, 10))  # width, height
ax = sns.heatmap(df,
                 cmap = 'PiYG', # 색상
                 fmt = 'd', # 'd'는 정수로 표현
                 linewidths = 0.5, # 셀 사이 간격
                 cbar = False, # 컬러바 표시 여부
                 square = True)  # 셀 정사각형 표현 여부

# heatmap3
fig, ax = plt.subplots(figsize=(20, 10))  # width, height
ax = sns.heatmap(df,
                 cmap = 'RdYlGn', # 색상
                 fmt = 'd', # 'd'는 정수로 표현
                 linewidths = 1, # 셀 사이 간격
                 cbar = True, # 컬러바 표시 여부
                 cbar_kws={'orientation': 'horizontal'}, # 컬러바 수평
                 square = True)  # 셀 정사각형 표현 여부


import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.colors import ListedColormap, BoundaryNorm

sel_col = ['#ba001e','#d80019','#f32b1d','#ff502b','#ff7c3c','#ffa84e','#ffcb6c','#ffe992','#fcfeb3','#e4f693','#c6ea74','#a0de5c','#68cb57','#39be56','#00b14d','#00893e','#006b31']
sel_colmap = ListedColormap(sel_col)

sel_norm = list(range(0, 170, 10))
sel_norm = BoundaryNorm(sel_norm, ncolors=len(sel_col))

# heatmap mycolor1
fig, ax = plt.subplots(figsize=(20, 10)) 
ax = sns.heatmap(df,
    cmap = sel_colmap, # 선택 색상
    norm = sel_norm, # 설정 기준
    cbar = True, # 컬러바 표시 여부
    cbar_kws = {'orientation': 'horizontal'}, # 컬러바 수평
    square = True, # 셀 정사각형 표현 여부
    fmt='d')

# heatmap mycolor1
fig, ax = plt.subplots(figsize=(20, 10)) 
ax = sns.heatmap(df,
    cmap = sel_colmap, # 선택 색상
    norm = sel_norm, # 설정 기준
    cbar = False, # 컬러바 표시 여부
    annot = True, # 값 표시 여부
    square = True, # 셀 정사각형 표현 여부
    fmt='d')

반응형