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

[Matplotlib] 컬러바(Colorbar) 만들어서 그래프에 삽입하기 (feat. LinearSegmentedColormap, Normalize, ScalarMappable)

by 부자 꽁냥이 2022. 9. 15.

안녕하세요~ 꽁냥이에요. 이번 포스팅에서는 Matplotlib에서 컬러바(Colorbar)를 만들고 그래프에 삽입하는 방법에 대해서 소개합니다.

 

- 목차 -

1. 컬러바(Colorbar) 기본

2. 컬러바(Colorbar) 꾸미기


   1. 컬러바(Colorbar) 기본

1) 기본

Matplotlib에서 컬러바(Colorbar)는 기본적으로 1) 컬러맵 LinearSegmentedColormap 설정, 2) 최대값과 최소값 대응 방식 결정, 3) 컬러바 생성 및 컬러바 삽입 과정으로 이루어집니다.

 

이제 그 과정을 코딩을 보면서 알아보겠습니다. 여기서는 산점도에 컬러맵을 적용합니다. 다른 그래프에도 적용하는 방식은 거의 흡사합니다.

 

먼저 필요한 모듈을 임포트하고 데이터를 불러옵니다. 그러고 나서 기본 산점도를 그려보았습니다.

 

import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.cm as cm
import pandas as pd

import matplotlib.colors as mcl

from sklearn.datasets import load_boston

boston = load_boston()
df = pd.DataFrame(boston.data, columns= boston.feature_names)
df['MEDV'] = boston.target

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
plt.scatter(df['CRIM'], df['MEDV'])
plt.show()

 

이제 3단계 과정을 통하여 컬러바를 만들고 그래프에 넣어봅시다.

 

## 1단계 컬러맵 LinearSegmentedColormap 설정
## Matplotlib에서 제공하는 기본 컬러맵
cmap = cm.bwr ## 또는 plt.cm.get_cmap('bwr')

## 2단계 최대값과 최소값 결정
vmax = df['LSTAT'].max()
vmin = df['LSTAT'].min()
norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)

## 컬러바 생성
colormapping = cm.ScalarMappable(norm=norm, cmap=cmap)

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

plt.scatter(df['CRIM'], df['MEDV'], c=df['LSTAT'], cmap=cmap)

## 컬러바 삽입
cbar = fig.colorbar(colormapping, ax=plt.gca()) ## 컬러바 삽입
plt.show()

 

line 3

먼저 컬러맵 LinearSegmentedColormap 설정합니다. 꽁냥이는 Matplotlib에서 기본적으로 제공하는 컬러맵을 사용했습니다. 제공되는 컬러맵 목록은 여기에서 확인해보세요. 내가 원하는 컬러맵으로 커스터마이징하는 방법은 아래에서 소개하겠습니다.

 

line 6~8

2단계로 최대값과 최소값 대응 방식 결정합니다. 꽁냥이는 점의 색상을 LSTAT 값에 따라 적용하려고 합니다. 따라서 LSTAT 범위에 따라서 색상이 결정될 수 있도록 최대값과 최소값을 지정하고 이를 이용하여 matplotlib.colors.Normalize 클래스를 생성합니다.

 

line 11~19

마지막 단계입니다. 컬러바 생성하고 삽입합니다. 생성은 ScalarMappable 클래스를 이용합니다(line 11). 컬러바는 보통 figure 영역에 삽입하게 됩니다. 따라서 line 19와 같이 colorbar 함수를 사용하며 첫 번째 인자로 ScalarMappable 클래스, 그리고 Axes를 설정해줍니다(해당 Axes를 기준으로 오른쪽 figure 영역에 위치시킵니다). 

 

위 코드를 실행하면 아래와 같이 컬러바가 잘 나오는 것을 알 수 있습니다. 점들도 색상이 바뀌었고요.

 

 

2) 컬러바 색상 커스터마이징

이번엔 꽁냥이가 자주 활용하는 컬러바 색상 커스터마이징 방법을 소개합니다. 먼저 구글에서 pick color를 검색합니다. 그러면 아래와 같이 색상 선택 도구가 나오게 됩니다.

 

 

이제 컬러바에 넣고 싶은 색상을 클릭합니다. 그러고 나서 아래 빨간 박스에 있는 HSV 값 중에서 제일 앞에 것만 기억해주세요. 여기서는 132네요.

 

이제 코드로 작성합니다. 다른 부분은 똑같고 4~10번째 줄빼고 위와 동일합니다. h라는 변수에 기억하고 있던 132를 집어넣고 colors라는 1차원 배열이 3개인 리스트를 만들어 주는데 각각 가장 옅은 색상, 중간 색상, 가장 진한 색상을 hsv 대신 rgb값으로 변환시켜 줍니다. 그러고 나서 LinearSegmentedColormap.from_list를 통해 컬러맵을 생성하게 됩니다.

 

## 1단계 컬러맵 LinearSegmentedColormap 설정

## 커스터 마이징 컬러맵
h = 132
colors = [
    mcl.hsv_to_rgb((h/360,0,1)), ## 컬러바 가장 옅은쪽
    mcl.hsv_to_rgb((h/360,0.6,1)), ## 중간
    mcl.hsv_to_rgb((h/360,1,1)) ## 컬러바 가장 진한쪽
]
cmap = mcl.LinearSegmentedColormap.from_list('my_cmap', colors, gamma=2)

## 2단계 최대값과 최소값 결정
vmax = df['LSTAT'].max()
vmin = df['LSTAT'].min()
norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)

## 컬러바 생성
colormapping = cm.ScalarMappable(norm=norm, cmap=cmap)

fig = plt.figure(figsize=(8,8))
fig.set_facecolor('white')
plt.scatter(df['CRIM'], df['MEDV'], c=df['LSTAT'], cmap=cmap)

cbar = fig.colorbar(colormapping, ax=plt.gca()) ## 컬러바 삽입
plt.show()

 

코드를 실행하면 내가 선택한 색상이 적용된 컬러바가 만들어진 것을 알 수 있습니다. 

3) 여러 Axes에 서로 다른 컬러맵 적용하기

여러 그림을 그리는 경우 각 그림 마다 다른 컬러맵을 적용할 수도 있을 것입니다. 이때에는 앞에서 살펴본 방식으로 컬러맵을 각각 만들어 준 뒤 figure의 ax 인자에다가 적용할 컬러맵을 지정하면 됩니다. 여기서는 앞에서 만든 두개의 컬러바를 서로 다른 그래프에 적용합니다.

 

## 1단계 컬러맵 LinearSegmentedColormap 설정
## Matplotlib에서 제공하는 기본 컬러맵
cmap1 = cm.bwr ## 또는 plt.cm.get_cmap('bwr')

## 커스터 마이징 컬러맵
h = 132
v = 1
colors = [
    mcl.hsv_to_rgb((h/360,0,v)),
    mcl.hsv_to_rgb((h/360,0.9,v)),
    mcl.hsv_to_rgb((h/360,1,v))
]
cmap2 = mcl.LinearSegmentedColormap.from_list('my_cmap', colors, gamma=2)

## 2단계 최대값과 최소값 결정
vmax = df['LSTAT'].max()
vmin = df['LSTAT'].min()
norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)

## 컬러바 생성
colormapping1 = cm.ScalarMappable(norm=norm, cmap=cmap1)
colormapping2 = cm.ScalarMappable(norm=norm, cmap=cmap2)
fig, axs = plt.subplots(1, 2)
fig.set_size_inches((12, 6))
fig.set_facecolor('white')

ax1 = axs[0]
ax1.scatter(df['CRIM'], df['MEDV'], c=df['LSTAT'], cmap=cmap1)

ax2 = axs[1]
ax2.scatter(df['CRIM'], df['MEDV'], c=df['LSTAT'], cmap=cmap2)

cbar = fig.colorbar(colormapping1, ax=ax1) ## 첫 번째 컬러바 삽입
cbar = fig.colorbar(colormapping2, ax=ax2) ## 두 번째 컬러바 삽입

plt.show()

 


   2. 컬러바(Colorbar) 꾸미기

여기서는 컬러바를 꾸며 보는 방법에 대해서 소개하는데요. 컬러바 눈금, 눈금 라벨, 타이틀 등을 바꿀 수 있고 테두리를 없앨 수도 있습니다. 아래 코드를 통해 그 사용법을 알아보세요.

 

특히 컬러바 색상을 반전시키고 싶다면 4번째 줄과 같이 reversed를 이용하여 반전시켜주세요. 컬러바를 꾸미는 부분은 21~27줄을 보시면 금방 익히실 수 있습니다(주석 참고). 

 

## 1단계 컬러맵 LinearSegmentedColormap 설정
## Matplotlib에서 제공하는 기본 컬러맵
cmap = cm.bwr ## 또는 plt.cm.get_cmap('bwr')
cmap = cmap.reversed() ## 색상을 반대로 적용하기
## 2단계 최대값과 최소값 결정
vmax = df['LSTAT'].max()
vmin = df['LSTAT'].min()
norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)

## 컬러바 생성
colormapping = cm.ScalarMappable(norm=norm, cmap=cmap)

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

plt.scatter(df['CRIM'], df['MEDV'], c=df['LSTAT'], cmap=cmap)

cbar = fig.colorbar(colormapping, ax=plt.gca()) ## 컬러바 삽입

## 컬러바 꾸미기
cbar.set_label('Colorbar Label') ## 컬러바 라벨
cbar.set_ticks([vmin, 0.5*(vmin+vmax), vmax]) ## 컬러바 눈금 좌표 설정
cbar.set_ticklabels(['Low', 'Middle', 'High']) ## 컬러바 눈금 라벨 설정

cbar.ax.spines['outline'].set_visible(False) ## 컬러바 테두리 제거
cbar.ax.tick_params(size=0) ## 눈금 제거
cbar.ax.set_title('Colorbar Title') ## 컬러바 타이틀

plt.show()

 

 


컬러바를 많이 사용했지만 정작 관련 내용에 대해서 소개하지 않아서 이번 기회에 컬러바 다루는 방법을 소개했습니다. 컬러바는 2차원 산점도에서 다른 변수를 색깔로 표현할 수 있는 도구이므로 알아 두시면 분명 도움이 되실 거예요. 다음에도 좋은 주제로 찾아뵐 것을 약속드리며 이상 포스팅 마치겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.

 


댓글


맨 위로