함께하는 데이터 분석

[Python] Matplotlib 산점도 그래프 그리기 본문

데이터분석 공부/Python

[Python] Matplotlib 산점도 그래프 그리기

JEONGHEON 2022. 3. 31. 21:18

오늘은 Maplotlib을 이용하여

 

산점도 그래프를 그려보겠습니다.

 

 

라이브러리 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

 

plt.rc('font', family = 'AppleGothic') # mac 
# plt.rc('font', family = 'Malgun Gothic') # window
plt.rc('font', size = 12)
plt.rc('axes', unicode_minus = False) # -표시 오류 잡아줌

 

 

데이터 불러오기

import seaborn as sns

iris = sns.load_dataset('iris')

이번에는 seaborn에 내장되어있는 데이터인

 

iris데이터를 이용하여 산점도 그래프를 그려보겠습니다.

 

 

데이터 확인하기

iris.shape
>>> (150, 5)

iris 데이터는 150개의 행, 5개의 열이 존재하는 것을 확인할 수 있습니다.

 

iris.info()

species열을 제외한 나머지 열의 데이터는 수치형 변수인 것을 확인할 수 있고

 

species열은 범주형 데이터인 것을 알 수 있습니다.

 

iris.describe()

수치형 변수의 데이터의 사분위수와 평균 등등

 

값을 알아봤습니다.

 

species열은 범주형 데이터라 표시되지 않죠.

 

iris.describe(include = 'object')

describe에 include = 'object'를 넣어주시면

 

범주형 데이터도 요약해서 결과를 도출해줍니다.

 

3개의 unique 한 값이 존재하고

 

setosa가 제일 많고 그 빈도수는 50이라는 것을 알 수 있습니다.

 

iris.head()

 

iris.tail()

 

 

산점도 그래프 그리기

plt.figure(figsize = (10, 7))
plt.scatter(x = iris['sepal_length'], y = iris['sepal_width'])
plt.show()

plt.scatter를 이용하여

 

x축에 sepal_length, y축에 sepal_width를 넣고

 

산점도 그래프를 그려줬습니다.

 

150개의 데이터가 있어서 그래프가 보시다시피 상당히 난잡해서

 

데이터의 개수를 50개만 추출하여 실행해보겠습니다.

 

iris1 = iris[1:51]

iris1.shape
>>> (50, 5)

 

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'])
plt.show()

데이터의 개수가 줄은 것을 확인할 수 있죠.

 

이제 제목, x축, y축에 이름을 달아주겠습니다.

 

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'])
plt.title('sepal length와 width의 산점도')
plt.xlabel('50개의 sepal_length', loc = 'right')
plt.ylabel('50개의 sepal_width', loc = 'top')
plt.show()

 

점 크기 변경

np.random.seed(42)
sizes = np.random.rand(50) * 250
sizes
>>> array([ 93.63502971, 237.6785766 , 182.99848545, 149.66462105,
            39.00466011,  38.99863008,  14.52090304, 216.54403644,
           150.27875294, 177.01814445,   5.14612357, 242.47746304,
           208.1106602 ,  53.08477767,  45.4562418 ,  45.85112746,
            76.06056074, 131.18910791, 107.98625466,  72.80728505,
           152.96322368,  34.87346516,  73.03616213,  91.59046082,
           114.01749605, 196.29399035,  49.91844554, 128.5586096 ,
           148.10364222,  11.61260318, 151.88621298,  42.63103092,
            16.26289825, 237.22138431, 241.40800827, 202.09933703,
            76.15344229,  24.4180285 , 171.05825663, 110.03812343,
            30.50955871, 123.79422753,   8.59713028, 227.33010052,
            64.6949954 , 165.63057109,  77.92776902, 130.01700529,
           136.67756984,  46.21361388])

np.random.seed()를 설정하여 같은 수가 계속 뽑히게 해 주었고

 

이후 np.random.rand()를 이용하여 난수를 뽑아줬습니다.

 

np.random.rand(50)는 0~1 사이의 값을 갖는 균일 분포에서

 

50개의 난수를 뽑아줍니다.

 

다음 0~1 사이의 값이 작아 250을 곱해줬고

 

sizes에 할당해줬습니다.

 

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'], s = sizes)
plt.title('sepal length와 width의 산점도')
plt.xlabel('50개의 sepal_length', loc = 'right')
plt.ylabel('50개의 sepal_width', loc = 'top')
plt.show()

plt.scatter의 s에 아까 할당해준 sizes를 넣어주면 됩니다.

 

그래프를 보시면 점의 크기가 랜덤 하게 커진 것을 확인할 수 있죠.

 

이번에는 색깔을 변경해보겠습니다.

 

 

점 색깔 변경

colors = iris1['sepal_width']

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'] \
            , s = sizes, c = colors)
plt.title('sepal length와 width의 산점도')
plt.xlabel('50개의 sepal_length', loc = 'right')
plt.ylabel('50개의 sepal_width', loc = 'top')
plt.show()

iris 중 y축 데이터인 sepal_width를 colors에 할당해줬습니다.

 

그리고 plt.scatter에 c에 할당했습니다.

 

그래프를 보시면 y의 크기가 같은 라인은

 

색깔이 똑같은 것을 확인할 수 있죠.

 

이번에는 다른 색상을 넣어줘 볼까요?

 

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'] \
            , s = sizes,c = colors, cmap = 'magma')
plt.title('sepal length와 width의 산점도')
plt.xlabel('50개의 sepal_length', loc = 'right')
plt.ylabel('50개의 sepal_width', loc = 'top')
plt.show()

cmap에 magma를 넣어줘서 위와 같이 색깔이 변경된 것을 알 수 있습니다.

 

magma 뿐만 아니라 viridis, plasma, inferno, cividis 등등

 

다른 것들을 넣을 수도 있습니다.

 

하지만 color을 설정하지 않고 cmap을 설정하면

 

효과가 없다는 것을 알아두시기 바랍니다.

 

 

투명도 설정

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'] \
            , s = sizes, c = colors, cmap = 'magma', alpha = 0.7)
plt.title('sepal length와 width의 산점도')
plt.xlabel('50개의 sepal_length', loc = 'right')
plt.ylabel('50개의 sepal_width', loc = 'top')
plt.show()

앞서 봤던 선 그래프에서와 똑같이 alpha를 이용하여

 

투명도를 설정해줄 수 있습니다.

 

점이 같은 지점에 중복하여 찍혀져 있을 수 있으므로

 

투명도를 설정해주는 것은 산점도에서 유의미한 결과를 얻을 수 있습니다.

 

 

Colorbar 설정

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'] \
            , s = sizes, c = colors, cmap = 'magma', alpha = 0.7)
plt.colorbar()
plt.title('sepal length와 width의 산점도')
plt.xlabel('50개의 sepal_length', loc = 'right')
plt.ylabel('50개의 sepal_width', loc = 'top')
plt.show()

plt.colorbar()를 이용하여 오른쪽과 같이 설정해줄 수 있습니다.

 

이때 기준은 c에 넣어줬던 데이터입니다.

 

저는 iris['sepal_width'] 즉, y축 데이터를 넣어줬죠.

 

이번에는 colorbar에 이름을 넣어주겠습니다.

 

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'] \
            , s = sizes, c = colors, cmap = 'magma', alpha = 0.7)
plt.colorbar(label = 'sepal_width')
plt.title('sepal length와 width의 산점도')
plt.xlabel('50개의 sepal_length', loc = 'right')
plt.ylabel('50개의 sepal_width', loc = 'top')
plt.show()

label이 달아진 것을 확인할 수 있습니다.

 

이번에는 사이즈를 조정해볼까요?

 

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'] \
            , s = sizes, c = colors, cmap = 'magma', alpha = 0.7)
plt.colorbar(label = 'sepal_width', shrink = 0.5)
plt.title('sepal length와 width의 산점도')
plt.xlabel('50개의 sepal_length', loc = 'right')
plt.ylabel('50개의 sepal_width', loc = 'top')
plt.show()

plt.colorbar의 shrink인자에 0.5를 넣어서

 

크기가 반토막난 것을 보실 수 있습니다.

 

이번에는 colorbar를 수평으로 바꿔주겠습니다.

 

plt.figure(figsize = (10, 7))
plt.scatter(x = iris1['sepal_length'], y = iris1['sepal_width'] \
            , s = sizes, c = colors, cmap = 'magma', alpha = 0.7)
plt.colorbar(label = 'sepal_width', orientation = 'horizontal', shrink = 0.5)
plt.title('sepal length와 width의 산점도')
plt.xlabel('50개의 sepal_length', loc = 'right')
plt.ylabel('50개의 sepal_width', loc = 'top')
plt.show()

plt.colobar의 orientation에 horizontal

 

즉, 수평으로 지정하면 위와 같이 colorbar가 아래로 내려옵니다.

 

산점도 그래프 그리기는 여기서 마무리하겠습니다!