본문 바로가기
self.python

[python] seaborn으로 HeatMap 그리기 - 2 (최대값/최소값, Cbar, tick, Label 조절하여 그래프 그리기)

by 톤토니 2022. 12. 5.
반응형

히트맵

seaborn으로 HeatMap 그리기 - 2 (최대값/최소값, Cbar, tick, Label 조절하여 그래프 그리기)

 

지난 시간 Seaborn으로 HeatMap을 그리는 법에 대해 알아봤다면. 이번 시간은 그래프를 좀 더 깔끔하고 보기좋게 꾸미는 법에 대해 알아보겠다.

 

[ 지난 시간 복습 ]

 

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

 

 

 


 

 

1. Cbar 최대값, 최소값 설정하기(Vmin, Vmax)

 

현재 예제에서는 큰 필요는 없지만 좀 더 복잡한 데이터에서는 가끔 어떤 값 이상이나 이하의 값들은 같은 색으로 표현하고 싶을 때가 있다. 그럴 때 원본 데이터의 값을 수정하여 같은 색깔로 표시할 수 있지만 무척 번거로운 일이다.

 

heatmap에서는 이를 위한 옵션이 존재한다.

만약 50점 이하를 같은 색으로(같은 그룹으로) 90점 이상을 같은 색으로 표시하고 싶다면 Vmin, Vmax를 쓰면 간단히 해결된다.

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


sns.heatmap(df, # 위에서 전처리한 데이터프레임
            cmap = 'YlGn', # 색 지정
            annot = True,# 셀에 데이터 표시
            fmt = 'd', # 소수점 포맷팅 형태
            vmin = 50, vmax=90) # cbar 최소, 최대값 설정

 

 

 

 

 

 

 

 

 

2. Cbar 없애기

 

cbar는 heatmap 그래프의 오른쪽에 표시되는 막대로 색깔에 맞는 수치에 대한 정보를 담은 지표이다.

깔끔하게 그래프만 표시하고 싶다면, cbar를 없애고 지난 시간에 배웠던 각 셀에 값을 표시하는 것이 좋다.

 

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


sns.heatmap(df, # 위에서 전처리한 데이터프레임
            cmap = 'YlGn', # 색 지정
            annot = True, # 셀에 데이터 표시
            cbar=False) # cbar 표시 여부

 

 

 

더 깔끔해졌다. 다만 오른쪽 하단에 지수형식으로 표기된 데이터가 보인다.

이럴 때, 정수형태로만 표시하고 싶다면 'fmt' 옵션을 사용하면 된다.

 

* 파이썬의 format처럼 정수는 'd'를 소수점 2자리까지 표기하고 싶다면 '.2f'로 설정해주면 된다.

 

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


sns.heatmap(df, # 위에서 전처리한 데이터프레임
            cmap = 'YlGn', # 색 지정
            annot = True,# 셀에 데이터 표시
            fmt = 'd', # 데이터 포맷팅 형태
            cbar=False) # cbar 표시 여부

 

 

 

 

 

 

번외로 데이터 값이 아닌 순위를 표시할 수도 있다.

열이나 행의 각 순위를 표시하려면 annot=True 대신 annot=df.rank(axis="columns" 또는 "rows")를 입력하면 된다.

다만 조심해야 할 부분을 각 Subject 안에서 교통수단의 순위를 나타내고 싶다면 axis="rows"라고 할 수 있지만 "columns"라고 해야된다. 또한 동점이라면 중앙값이 표시된다.

 

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

sns.heatmap(df, # 위에서 전처리한 데이터프레임
            cmap = 'YlGn', # 색 지정
            cbar=False, # cbar 표시 여부
            linewidths = 0.01, # 선의 굵기
            linecolor = 'white', # 선의 색깔
            annot=df.rank(axis="columns")) # 열의 순위표시

 

 

 

 

 

3. 각 셀의 선 표시 & 선 색깔 바꾸기

 

각 셀을 더 구분하기 쉽도록 선을 그려넣고 선 색깔도 바꿀 수 있다.

linewidths로 선의 굵기를 조절하고 linecolor로 선의 색깔을 지정할 수 있다.

여기서 색깔은 파이썬의 색깔 옵션에 맞춰 설정하능하다. 

 

sns.heatmap(df, # 위에서 전처리한 데이터프레임
            cmap = 'YlGn', # 색 지정
            annot = True,# 셀에 데이터 표시
            fmt = 'd', # 소수점 포맷팅 형태
            cbar=False, # cbar 표시 여부
            linewidths = 0.01, # 선의 굵기
            linecolor = 'white') # 선의 색깔

 

 

 

 

 

 

 

 

 

 

4. 축 tick 위치 바꾸기

 

x축 tick을 아래가 아닌 위쪽으로 바꾸고 싶을 수도 있고 y축을 오른쪽으로 바꾸고 싶다면

'ax.xaxis.tick_top' 또는 'ax.yaxis.tick_right'을 사용하면 된다.

 

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

sns.heatmap(df, # 위에서 전처리한 데이터프레임
            cmap = 'YlGn', # 색 지정
            annot = True,# 셀에 데이터 표시
            fmt = 'd', # 소수점 포맷팅 형태
            cbar=False, # cbar 표시 여부
            linewidths = 0.01, # 선의 굵기
            linecolor = 'white') # 선의 색깔

 

 

 

 

 

5. 축 Label 설정하기

 

X축과 Y축의 변수에 대한 설명이 필요하거나 필요없어졌을 때, 축  Label을 설정하는 방법은 간단하다.

축 라벨을 없애고 싶다면 ax.set(xlabel="", ylabel="") 이와 같이 하면 되고, 

반대로 축 라벨을 사용하고 싶다면 위의 코드에서 맞는 값을 써넣어주면 된다.

 

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

sns.heatmap(df, # 위에서 전처리한 데이터프레임
            cmap = 'YlGn', # 색 지정
            annot = True,# 셀에 데이터 표시
            fmt = 'd', # 소수점 포맷팅 형태
            cbar=False, # cbar 표시 여부
            linewidths = 0.01, # 선의 굵기
            linecolor = 'white') # 선의 색깔

ax.set(xlabel="Transportation", ylabel="Activity")

 

 

 

 

 

반응형

댓글