본문 바로가기
Programming/Python

[Python] Matplotlib 파이썬으로 데이터 시각화 하기. / line plot / Scatter plot / Bar plot / Histogram

by EunjiBest 2022. 5. 6.

[Python] Matplotlib 파이썬으로 데이터 시각화 하기. / line plot / Scatter plot / Bar plot / Histogram


데이터 분석을 시작할 때 습관적으로 가장 첫 째줄에 손가락이 자동으로 치는 코드 3줄
import numpy as np
import pandas as pd
import matpoltlib.pyplot as plt

그 외에 seaborn이나 sklearn 등이 있긴하지만 부수적인 것들이고,
위 3개는 데이터 분석에 있어서 꼭 필수적이지 않을까 생각을한다.

numpy와 pandas는 포스팅을 했고!
이번 포스팅은 matplotlib이다.


Matplotlib


한국어로 발음을 하면
맽플롯립, 맽플롯라이브러리, 매트플롯립... 뭐 다양하게 부르는 것같다.

아무튼
Matplotlib란 무엇이냐하면,
파이썬에서 데이터를 그래프나 차트로 시각화 할 수 있는 라이브러리이다.

시각화란 매우 중요하다는 것은 누구나 알 것이다.
글보단 그림이 이해가 더 잘 가는 것은 사실이니깐!

데이터 분석에 있어서도 마찬가지이다.
사실 데이터 분석을 하면 결과값이 '정확도 0.912913%' 이런식으로 복잡한 숫자들의 집합체가 나온다.
이것들을 그래프나 차트로 시각화하면 조금 더 수월하게 데이터에 대한 의미부여가 가능하고
인사이트를 찾기도 쉽다.

matplotlib 사용해보기



1. state-machine interface

import matplotlib.pyplot as plt

x = [1,2,3,4,5]
y = [1,2,3,4,5]

plt.plot(x,y)
plt.title("First Plot")
plt.xlabel("x")
plt.ylabel("y")

1. 라이브러리를 불러온다.
import matplotlib.pyplot as plt
2. 데이터 값을 리스트로 x,y에 각각 할당해준다.
3. plt.plot(x,y) -> 그래프를 출력한다.
4. plt.title("First Plot") -> 타이틀 정하기
5. plt.xlabel("x") -> x축 이름정하기
6. plt.ylabel("y") -> y축 이름정하기

그럼 결과값은 x와 y의 총 5개의 쌍이 좌표에 찍혀서 일차방정식 그래프가 보여진다.
(1,1) (2,2) (3,3) (4,4) (5,5)

또한 타이틀은 상단에 위치하게 되고, x축 이름은 x축 하단에, y축 이름은 y좌표 축에 나타나 있는 것을 볼 수 있다.

다음은,
다른 방법으로 위에서 그린 그래프와 같은 그래프를 그려보도록 하겠다.


2. Object Oriented Interface - 객체기반 스타일

import matplotlib.pyplot as plt

x = [1,2,3,4,5]
y = [1,2,3,4,5]

fig, ax = plt.subplots()
ax.plot(x,y)
ax.set_title("First Plot")
ax.set_xlabel("x")
ax.set_ylabel("y")


코드가 비슷해보이지만 무언가 추가된 느낌이 든다.
첫 번째 방법(state-machine interface)은 자동으로 figure와 ax를 생성해줬지만,
이 코드는 (Object Oriented Interface)는 직접 생성을 해주어서 그래프를 그려줘야한다.

x,y에 리스트를 할당하는 것까지는 똑같지만,

fig,ax에 plt.subplots()를 가져와야한다.
ax.plot(x,y) -> 그래프를 그린다.
ax.set_title("First Plot") -> 타이틀 정하기
ax.set_xlabel("x") -> x축 이름정하기
ax.set_ylabel("y") -> y축 이름정하기

이쯤에서 알아두어야할 figureax ※

figure : 그래프가 담겨있는 배경. (도화지)
ax : 그래프 자체 (그림)



따라서
ax에 plot(), set_title, set_xlabel을 하는 이유는
당연히 ax(그래프)에 관해서 붙여줘야하는 사항들이기 때문이다.

왜냐하면 다음 그림과 같이 ax가 두 개일 수 있기 때문이다.





저장하기

 

import matplotlib.pyplot as plt

x = [1,2,3,4,5]
y = [1,2,3,4,5]

fig, ax = plt.subplots()
ax.plot(x,y)
ax.set_title("First Plot")
ax.set_xlabel("x")
ax.set_ylabel("y")
fig.set_dpi(300)
fig.savefig("first_lot.png")


fig.set_dpi(300) -> figure의 해상도를 dpi300으로 하자
라는 뜻이다
그렇다면 이번에는


ax.가 아닌 fig에 함수를 붙였을까?
figure는 그래프를 나타내는 배경같은 존재이다.
그래프 자체의 해상도를 조정하는 것이 아니라, 그래프가 담겨있는 도화지 자체의 해상도를 조절하는 것이다.

fig.savefig("first_lot.ong")
저장 하는 것 또한 figure(도화지)를 저장하는 것이지 ax(그래프)를 저장하는 것이 아니다.
"first_lot"이라는 이름, png 형식으로 저장하겠다는 뜻이다


그래프 여러개 그리기


한개의 figure에 여러가지 ax를 그려보자.

import numpy as np


x = np.linspace(0, np.pi*4, 100)
fig, axes = plt.subplots(2,1)

axes[0].plot(x,np.sin(x))
axes[1].plot(x, np.cos(x))


수학적 함수를 사용하기 위해서 넘파이 라이브러리를 가져와봤다.

1. 0부터 4파이까지 100개의 구간으로 나누어서 나온 데이터를 x라고 지정.
2. plt.subplots에 2와 1을 넣어서 세로축으로 2개, 가로축으로 1개의 데이터를가진 그래프를 뽑을 것이다.
3. 첫번째 그래프는 axes[0]이다. plot함수에 x값은 x데이터를 넣고, y값은 x에 해당하는 sin그래프를 그린다.
4. 두번째 그래프는 axes[1]이다.  plot함수에 x값은 x데이터를 넣고, y값은 x에 해당하는 cos그래프를 그린다.


Line plot - 선그래프

 

fig, ax = plt.subplots()
x = np.arange(15)
y = x**2

ax.plot(
    x,y,
    linestyle = ":",
    marker = "*",
    color = "#524FA1"
)


1. 그래프 틀을 만들어준다.
2. x에는 0부터 14까지 데이터를 가져온다.
3. y에는 x에 제곱을 한 값을 가져온다.
4. ax.plot()안에 x,y 데이터를 넣고 line style,marker, color등 각각의 옵션을 지정한다.


- line style - 말 그대로 라인의 스타일이다.

linestyle = "-" / linestyle = "--"
linestyle = "-." /linestyle = ":"


- Color

color = "r" / color = "g" / color = "b"

rgb인 색상은 r:빨, g:초, b:파 이렇게 간추려서 넣을 수 있다.

color = 'yellow' / color = 'black' / color = 'purple' / color = 'orange' / 


rgb이외의 다른 색상은 영문이름을 입력해주어야하는데,
pink, skyblue, plum, yellowgreen 등 호기심에 다양한 색상들을 입력해 보았는데
모두 잘 출력이 되어서 당황스럽다.
어떤 색상까지 되는지 모르겠지만, 먼셀 10색상환에 있는 색상까지는 가능할 것같다ㅋㅋ

color = '0.1' /color = '0.8'/color = '1'

문자열로 0~1 사이의 수를 넣으면 그레이스케일로 표현이 된다.
0에 가까울 수록 black에 가깝다.

color = "#000000" /color = "#524FA1" /color = "##34E6A1"

rgb에 대한 16진수 코드도 가능하다.
이렇게 사용하면 무한한 색상을 다양하게 사용할 수 있는 장점이 있다.



- Marker - 좌표를 찍어주는 기호

왼쪽 상단부터 : marker = "." /marker = "o" /marker = "v" /marker = "s" /marker = "*" 





- 축 경계

x = np.linspace(0,10,1000)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x))
ax.set_xlim(-2,12)
ax.set_ylim(-1.5, 1.5)


1. x에 0부터 10사이의 1000개의 데이터를 뽑아서 가지고온다.
2. fig,ax 가져옴
3. sin그래프 만들기
4. set_xlim()을 통해서 x축이 어디서 시작하고 어디서 끊기는지 지정.
-> 결과 그래프를 보면 x축이 -2에서 12인 것을 볼 수 있다.
4. set_ylim()을 통해서 y축이 어디서 시작하고 어디서 끊기는지 지정.
-> 결과 그래프를 보면 y축이 -1.5에서 1.5인 것을 볼 수 있다.

만약 경계값을 조정하는 옵션을 넣지 않는다면?
알아서 적정한 형태로 만들어지게 된다.


- 범례

fig, ax = plt.subplots()

ax.plot(x,x, label = 'y = x')
ax.plot(x,x**2, label = 'y =x^2')
ax.set_xlabel("x")
ax.set_ylabel("y")

ax.legend(
    loc = 'upper right',
    shadow = True,
    fancybox = True,
    borderpad = 2
)

범례란 현재 결과 그래프의 오른쪽 상단에 있는 박스이다.
안에는 그래프에 대한 선과 라벨 정보가 담겨있는 것을 알 수 있다.

함수는
ax.legend()를 사용하며 그 안에 다양한 옵션이 들어간다.,

loc : 위치(location)
loc= 'upper right' -> 위오른쪽
loc= 'upper left' -> 위 왼쪽
loc= 'lower right' -> 아래 오른쪽
loc= 'lower left' -> 아래 왼쪽
loc= 'center' -> 중앙

shadow = Ture -> 그림자유무
fancybox = Ture -> 박스 라운딩 유무
borderpad = 크기 -> 범례 정보와 박스 사이의 크기

등의 세세한 옵션들이 존재한다.


Scatter - 산점도 그래프


line plot은 선으로 나타낸 그래프라면,
Scatter plot은 점으로 찍힌 그래프라고 생각하면 되겠다.

변수들이 어느부분에 뭉쳐있는지, 어떤 특징들을 가지고 있는지 상관관계를 확인하기에 적합한 그래프이다.

fig,ax=plt.subplots()

x  = np.arange(10)
ax.plot(
    x, x**2, "o",
    markersize = 15,
    markerfacecolor = 'white',
    markeredgecolor = "blue"
)

지금까지 했던 것과 마찬가지로
fig,ax를 만들어주고
x변수에 0~9까지 수를 넣어준다.

ax.plot안에 다양한 옵션이 들어가게 되는데,
x, x**2여기까지는 line plot과 똑같고 추가 되는 것은 "o" 이다.
즉, 세번째 인자에 마커값을 주게 된다면, 선이 이어지지 않은 상태로 나타내는 것이다.

그리고나서
각각의 옵션은 다음과 같다.

markersize15  -> 원의 크기
markerfacecolor'white' -> 원의 안쪽 색상
markeredgecolor"blue" -> 원의 바깥쪽 색상



그러면 좀 더 다양한 형태의 Scatter를 만들어보자.

fig,ax=plt.subplots()

x  = np.random.randn(50)
y  = np.random.randn(50)
colors = np.random.randint(0,100,50)
sizes = 500*np.pi*np.random.rand(50)**2

ax.scatter(
  x,y,c=colors, s = sizes, alpha = 0.3
)


fig,ax 를 먼저 만들어주고, 다음 변수에 랜덤하게 데이터들을 채워줘보자.

위 코드에서는
x와 y에 각각 정규분포에서 50개씩 데이터를 가져와서 만들어주고
colors 라는 변수에는 0부터 100사이의 랜덤한 수 50개를 뽑아서 저장시켜주었다.
sizes 라는 변수에는 500에 파이를 곱하고 랜던 숫자 하나 뽑아서 제곱해주었다.

ax.scatter에 x,y, c(컬러값)에 colors, s(사이즈)에 sizes, alpha(투명도)는 적당하게 0.3정도를 주어서
scatter플롯을 다양하게 표현을 해줄 수 있다.



Bar plot - 막대 그래프


Bar plot을 만드는 법을 알아보자.

x = np.arange(10)

fig,ax = plt.subplots(figsize = (12,4))

ax.bar(x,x*2)


x데이터를 지정해주고,
fig,ax를 만들어주는데 이번에는 figsize를 정해주었다. 위 코드는 12(가로)x4(세로) 라는 뜻이다.
ax.bar(x값, y값)을 넣어주면 bar plot이 완성된다.


누적 bar plot도 그려보자.

x = np.random.rand(3)
y = np.random.rand(3)
z = np.random.rand(3)
data = [x,y,z]

fig,ax = plt.subplots()
x_ax = np.arange(3)
for i in x_ax:
  ax.bar(x_ax, data[i],
  bottom = np.sum(data[:i], axis = 0))
ax.set_xticks(x_ax)
ax.set_xticklabels(["A","B","C"])

코드가 꽤 복잡(?)하니 하나씩 뜯어보자.

1~4 . x,y,z 데이터를 data변수에 리스트로 넣어준다.
5. fig, ax 를 만들어준다.
6. x_ax라는 변수에 0~2까지 수를 넣어준다.
7. for 문에 x_ax를 돌린다. -> 0,1,2가 순서대로 돌아가게 된다.
8. ax.bar()를 이용해서 bar plot을 만들 건데 함수 안 인수는
x값 = x_ax 즉, 현재 돌아가고 있는 for문의 i,
y값 = data[i] 이므로, 리스트 안 요소 x,y,z가 순서대로 돌아간다.
bottom은 데이터 누적의 시작을 어디서 부터 시작할 것인지 정한다.
데이터의 누적은 i번째 이전데이터의 모든 합부터 시작.
axis = 0 누적을 어느 방향으로 쌓을 것인지.
11. ax.set_xticks() x좌표 bar 지정. -> 위 코드는 x_ax로 지정했으므로, x_ax의 값 0,1,2로 할당
12. ax.set_xticklabels() x좌표 bar의 이름 -> 0,1,2에서 A,B,C로 이름이 바뀜.

누적그래프에서 중요한 것은, bottom이다.
어느 값에서 부터 누적을 해야하는지 알려주어야 하기 때문이다.



Histogram - 도수분포표

 

fig, ax = plt.subplots()
data = np.random.randn(1000)
ax.hist(data,bins = 50)

fig,ax를 만들어주고,
data는 np의 표준정규분포에서 1000개의 데이터를 가져와준다.
ax.hist(data, bins = '막대 그래프의 개수')
이렇게 만들 수 있다.

만약
bins = 10이라면,


막대그래프가 10개만 추출되는 것을 알 수 있다.







간단하게나마
파이썬으로 데이터를 시각화 하는 방법을 알아보았다!
코드 자체가 워낙 명확하기도 하고, 바로바로 결과가 눈에 보이는 것이
포스팅하면서 흥미가 있었다.

이정도 코드는 외우고있지 않아도
구글링하면 바로 나오고, 적용도 어렵지 않게 할 수 있기 때문에
이런게 있구나~ 만 알아두면 되겠다!

 

반응형

댓글