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")
'self.python' 카테고리의 다른 글
[python] 양방향 막대 그래프 그리기 2 - 천단위 콤마, 레이블 위치 (0) | 2023.06.10 |
---|---|
[python] 양방향 막대 그래프 그리기 - barh 함수 사용 (0) | 2023.05.20 |
[python] seaborn으로 HeatMap 그리기 - 1 (0) | 2022.11.06 |
[python] 데이터 프레임 전처리 - replace 이용하기 (0) | 2022.07.03 |
[python] 숫자 데이터 자리수 맞추어 표시하기(앞에 0 채워주기) - zfill() (0) | 2022.06.27 |
댓글