Matplotlib 시각화(1)
Matplotlib는 다양한 파이썬 시각화 라이브러리의 기본 뼈대라고 할 수 있으며, 사용 범위는 정형 데이터, 이미지 시각화 등 매우 다양하게 사용할 수 있다.
선그래프(Line Plot)
선그래프란 연속하는 데이터 값들을 직선 또는 곡선 형태로 구하는 것을 말한다. 특히 주가나 일일 매출 등과 같이 연속적인 값의 변화와 패턴을 파악하는 데 적합하다. 이 글에서는 모듈에서 제공하는 데이터를 불러와 작업할 것이다.
import yfinance as yf
data = yf.download('AAPL', '2019-08-01', '2020-08-01')
ts = data['Open']
print(ts.head())
먼저 Fix_Yahoo_Finance 라이브러리에서 데이터셋을 가져온다.
AAPL(애플) 명을 입력하고, 데이터 조회 시작일과 종료일을 입력한다.
6가지 변수 중 Open 변수만 가져와 ts 객체로 저장한다.
여기서 Matplotlib 그래프를 구현하는 방법은 크게 2가지가 있다.
- Pyplot API : Matplotlib, Pyplot 모듈에 있는 함수들을 각각 불러와서 구현하는 방법. 사용하기 편리한 것이 장점
- 객체 지향 API : Matplotlib에 구현된 객체 지향 라이브러리를 직접 활용하는 방법. 그래프의 각 구성 요소를 다양하게 제어하고 싶다면 객체 지향 API를 활용하는 것이 좋다.
- Matplotlib.Pyplot API
첫 번째 방법인 Pyplot API 방법을 활용한다.
# Matplotlib.Pyplot API
plt.figure(figsize = (10, 6))
plt.plot(ts)
plt.legend(labels = ['Price'], loc = 'best')
plt.title('Stock Market fluctuation of AAPL')
plt.xlabel('Date')
plt.ylabel('Stock Market Open Price')
plt.show()
먼저 figure()에서 그래프의 크기를 지정한 뒤 plot() 메소드 내에 ts 객체를 넣으면 그래프가 완성된다. 그다음부터는 그래프의 제목, x축, y축, 범례 등을 지정한다.
- 객체 지향 API
Matplotlib 아키텍트는 크게 3가지 레이어로 구성된다. Backend Layer, Artist Layer, Scripting Layer로 구성된다.
이때 흔히 객체 지향의 개념을 도입해 다양하게 커스텀화하는 영역이 Artist Layer이다.
그럼 실습을 통해 살펴보자.
# 객체지향 API
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
fig = Figure()
import numpy as np
np.random.seed(6)
x = np.random.randn(20000)
ax = fig.add_subplot(111)
ax.hist(x, 100)
ax.set_title('Artist Layer Histogram')
fig.savefig('Matplotlib_histogram.png')
가상의 데이터를 만든 뒤, Artist Layer에서 Axes 객체를 만든다. 그 후 Axes 객체에 있는 hist()를 호출한다.
Axes 객체에 있는 set_title()을 호출하고 마지막으로 Figure 객체에 구현된 Axes를 담아서 패키징화해 내보낸다.
이 방법이 가장 원시적이다. 그러나 보는 것처럼 불러와야 할 라이브러리도 많아지고 조금 더 복잡해진다.
막대그래프(Bar Plot)
막대를 사용해 주로 다른 범주와의 데이터를 비교한다. 막대 높이의 상대적인 길이 차이를 통해 데이터를 설명한다. 이번에는 커피 판매 데이터로 월별 시각화를 연습해보자.
import calendar
month_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
sold_list = [300, 400, 550, 900, 600, 960, 900, 910, 800, 700, 550, 450]
fig, ax = plt.subplots(figsize = (10, 6))
plt.xticks(month_list, calendar.month_name[1:13], rotation = 90)
plot = ax.bar(month_list, sold_list)
for rect in plot:
height = rect.get_height()
ax.text(rect.get_x() + rect.get_width() / 2, 1.002*height, '%d'% int(height), ha = 'center', va = 'bottom')
plt.show()
x축에 날짜들을 Calendar의 모듈을 활용해 리스트 형태로 January ~ December까지 순서대로 출력하는 것을 확인할 수 있다. ax.bar()에 정의된 두 개의 리스트 Month_List와 Sold_List 값을 추가한다. 그리고 반복문을 통해 각 막대그래프 위에 숫자를 추가한다.
산점도 그래프
산점도는 두 수치형 변수의 분포를 비교하고 두 변수 사이에 상관관계가 있는지 여부를 확인하는 데 사용된다. 데이터 내에 구별되는 군집 / 분할이 있으면 산점도에서도 명확해진다. Seaborn 라이브러리 내의 데이터를 불러와 실습해보자.
import seaborn as sns
tips = sns.load_dataset('tips')
x = tips['total_bill']
y = tips['tip']
fig, ax = plt.subplots(figsize = (10, 6))
ax.scatter(x, y)
ax.set_xlabel('Total Bill')
ax.set_ylabel('Tip')
ax.set_title('Tip ~ Total Bill')
fig.show()
이것이 기본적인 산점도 그래프이다. 하지만 두 그룹 간의 산점도를 비교하려면 약간의 데이터 전처리가 필요하다.
tips = sns.load_dataset('tips')
x = tips['total_bill']
y = tips['tip']
tips['sex_color'] = tips['sex'].map({"Female" : '#0000FF', 'Male' : '#00FF00'})
fig, ax = plt.subplots(figsize = (10, 6))
for label, data in tips.groupby('sex'):
ax.scatter(data['total_bill'], data['tip'], label = label,
color = data['sex_color'], alpha = 0.5)
ax.set_xlabel('Total Bill')
ax.set_ylabel('Tip')
ax.set_title('Tip ~ Total Bill by Gender')
ax.legend()
fig.show()
그래프를 보면 남성과 여성에 따른 데이터를 각각 나눠 그려 의미가 분명해졌다. 그래프를 통해 확인하면 Male 그룹이 Female 그룹보다 Total Bill과 Tip이 더 많은 것을 확인할 수 있다.
'파이썬 시각화' 카테고리의 다른 글
Seaborn 시각화(2) (0) | 2021.09.29 |
---|---|
Seaborn 시각화(1) (0) | 2021.09.28 |
Matplotlib 시각화(2) (0) | 2021.09.28 |