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

[산점도(Scatter Plot)] 2. Matplotlib을 이용하여 산점도 멋지게 만들어보기

by 부자 꽁냥이 2021. 5. 22.

안녕하세요~ 꽁냥이에요. 저번 포스팅에서는 산점도를 그리고 꾸며보는 방법에 대해서 알아보았습니다.

 

[산점도(Scatter Plot)] 1. Matplotlib을 이용하여 산점도 그리기

 

"저번 포스팅에서 산점도 꾸미는 방법을 이미 알아보았는데 무슨 또 꾸미고 있느냐?"라고 하실지 모르겠지만 꽁냥이는 아직 뭔가 부족하다고 생각했어요. 그래서 이번 포스팅에서는 좀 더 고급(?)스럽게 보이기 위하여 산점도를 꾸미는 방법에 대해서 알아보려고 합니다.

 

여기서 다루는 내용은 다음과 같습니다.

 

1. 예제

2. 산점도에 컬러맵 적용하기

3. 텍스트 표시하기


   1. 예제

먼저 다음의 상황을 생각해봅시다~


나팀장 : 꽁냥씨~ 어디 가나요?

꽁냥이 : 네 팀장님. 이제 퇴근하려고 합니다.

나팀장 : 방금 카페 위치와 매출액 데이터를 받았는데요.

           카페 분포랑 매출액 순위를 볼 수 있도록 시각화해주세요.

꽁냥이 : 네 알겠습니다.

 

꽁냥이는 오늘도 야근을 합니다.


여기서는 카페 위치와 매출 순위를 산포도를 이용하여 시각화해보겠습니다. 먼저 필요한 모듈을 임포트하고 데이터를 만들어 줍니다.

 

import matplotlib.pyplot as plt
import matplotlib.colors as mcl
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings(action='ignore')

from matplotlib.colors import LinearSegmentedColormap

 

np.random.seed(133)

num_data = 50
x = np.random.rand(num_data)
y = np.random.rand(num_data)
z = np.random.randint(1,10,num_data)

cafe_sales_df = pd.DataFrame()
cafe_sales_df['x좌표'] = x
cafe_sales_df['y좌표'] = y
cafe_sales_df['매출액(100만)'] = z

 

 

이제 산점도를 그려봅시다~~


   2. 산점도에 컬러 맵 적용하기

먼저 컬러 맵을 적용할 색상을 골라줍니다. 여기에 들어가서 맘에 드는 색 하나를 골라주세요. 또는 구글에 color picker를 검색하면 됩니다.

 

 

위 그림에서 색상을 선택하면 HSV 값을 기억해주세요. 이제 이를 이용하여 컬러맵을 만들어줍니다. 아래 코드를 살펴볼게요.

 

h = 304
s = 0.99
v = 0.99

colors = [
    mcl.hsv_to_rgb((h/360,0.2,v)),
    mcl.hsv_to_rgb((h/360,0.6,v)),
    mcl.hsv_to_rgb((h/360,1,v))
]

cmap = LinearSegmentedColormap.from_list('my_cmap',colors,gamma=3)

 

line 1~3

앞에서 골라준 색상의 HSV 값을 지정합니다.

 

line 5~11

컬러 맵을 만들어줍니다. 특히 5~8번째 줄은 색상의 3 지점을 잡아주어 일종의 그라데이션을 만들어주는 것입니다. 컬러 맵에 대한 내용은 추후 포스팅하겠습니다.

 

이제 컬러 맵을 적용해봅시다. 컬러맵을 적용할 때 각 데이터의 색 진하기를 나타내기 위하여 scatter 함수에서 c 인자를 제공합니다. 꽁냥이는 매출액이 클수록 색상을 진하게 표시하기 위하여 c 인자에 매출액 배열을 지정하였습니다. c인자를 쓸 때에는 color인자를 쓰면 안 됩니다. 안 그러면 에러나요~

 

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

plt.scatter(x, y, 
            marker = 'o', ## 마커 스타일
            c = z, ## 색상의 정도를 나타내는 배열 이때에는 color를 사용하면 안된다.
            s = 25, ## 마커 사이즈 
            cmap = cmap
           )
pc = plt.colorbar()
pc.ax.set_yticklabels([str(x) for x in list(range(1,10))][::-1]) 
plt.show()

line 10

컬러 맵을 추가할 때 컬러 바(color bar)를 추가해주어 그림의 해석을 돕도록 합니다.

 

line 11

꽁냥이는 1위부터 매출액이 높은 것에서 낮은 쪽으로 순위를 매기고 싶었습니다. 그래서 컬러바(color bar) 눈금 라벨을 색이 가장 진한 곳을 1, 옅은 곳을 9로 두었습니다.

 

 

코드를 실행하면 컬러 맵(colormap)이 잘 적용된 것을 알 수 있습니다. 기존 산점도보다 더 예뻐 보입니다.

반응형

   3. 텍스트 표시하기

위 그림을 팀장님께 보여드렸더니 매출이 1위인 곳을 따로 표시해주면 좋겠다고 하십니다(실화 X). 그래서 꽁냥이는 annotate를 사용하여 매출이 1위인 곳을 텍스트로 표시해주려고 합니다. annotate와 관련해선 추후 포스팅하겠습니다.

 

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

plt.scatter(x, y, 
            marker = 'o', ## 마커 스타일
            c = z, ## 색상의 정도를 나타내는 배열 이때에는 color를 사용하면 안된다.
            s = 25, ## 마커 사이즈 
            cmap = cmap
           )

pc = plt.colorbar()

## 매출액이 1위인 곳을 표시
target_indice = np.where(z==max(z))[0] ## 매출이 가장 높은 곳의 인덱스 추출

## 해당 카페의 위치를 마커로 표시
plt.scatter(x[target_indice],y[target_indice],
            s=100,
            facecolors='none', 
            edgecolors='k'
           )

## annotate를 사용하여 텍스트 까지 표시
for idx in target_indice:
    plt.annotate('1st cafe', xy=(x[idx],y[idx]), xytext=(x[idx]+0.05,y[idx]+0.05),
    arrowprops=dict(arrowstyle='->'),
    bbox=dict(boxstyle='square,pad=-0.07', fc='none', ec='none'),)

yticks = [str(x) for x in list(range(1,10))][::-1]

pc.ax.set_yticklabels(yticks) 
plt.show()

 

위 코드를 실행해보세요.

 

 

매출액이 1위인 곳의 카페가 잘 표시되었습니다.


이번 포스팅에서는 산점도를 좀 더 보기 좋게 그리고 고급스럽게 꾸며보는 방법을 살펴보았습니다. 고급스럽게 꾸민다는 것이 광범위해서 오늘 다룬 내용과는 다른 방식으로 꾸밀 수 있을 것입니다. 꽁냥이가 찾아보다가 또는 아이디어가 떠올라서 고급스럽게 보일 수 있는 방법이 생각나면 추가적으로 포스팅하도록 하겠습니다.

 

부디 이번 포스팅 내용이 도움이 되셨길 바라며 지금까지 꽁냥이의 글 읽어주셔서 감사합니다. 다음에 또 만나요~


댓글


맨 위로