본문 바로가기

Python 기초

[파이썬] Pandas, Matplotlib 그래프(line, bar) 그리기_01

반응형

Pandas, Matplotlib 그래프 그리기

 

Pandas, Matplotlib 그래프 그리기_01

 

 

판다스(Pandas)는 파이썬에서 제공하는 데이터 분석을 위한 라이브러리이고, 
매트플롯(Matplotlib)데이터 시각화를 위한 파이썬 라이브러리입니다.

 

이러한 라이브러리를 활용하여 다양한 그래프(꺾은선, 막대, 파이, 히스토그램, 박스 그래프 등)를 그리며,
효과적인 시각적 전달을 위해 여러 설정 값(크기, 색상, 그리드, 간격, xy 축 표현 등)들을 적절히 설정할 수 있습니다.

 

데이터를 시각화하기 위한 첫 번째로, 
그래프의 가장 기본인 꺾은선(line) 그래프와 막대(bar) 그래프를 연습해보려 합니다.

 

예제 데이터는 비트 코인 가격과 거래량이며, 사용 툴은 주피터 노트북을 사용합니다.

#주피터 노트북 설치

 

 


 

Step 1. 데이터 불러오기

주피터 노트북 실행 → 데이터 생성

따로 원하는 데이터가 있으면, 어느 것을 사용해도 무방합니다. 
일반적으로 많이 사용하는 .csv 파일을 불러오는 코드는 아래를 참고해 주세요.

import pandas as pd				#Pandas 라이브러리를 pd 라는 이름으로 가져와요

df = pd.read_csv ('경로/파일명.csv')		#pd에 있는 read_csv()함수로 .csv 파일을 읽어요

 

저는 업비트API로 현재부터 지난 100일간 1일 간격의 비트코인 시세 데이터를 불러왔습니다.
아래 표에서 알 수 있듯이, 그 날의 시작 가격(open), 최고 가격(hight), 최저 가격(low), 종료 가격(close)과 함께 거래량(volume)까지 알 수 있습니다.

import pyupbit			#pyupbit 라이브러리 가져오세요

df_day = pyupbit.get_ohlcv("KRW-BTC", interval="day", count=100)	#비트코인 일봉 데이터, 100개 호출
df_day

BTC(원화) 일봉 기준 가격 및 거래량

 

# 이번 포스팅은 "그래프 그리는 방법"이 목적 이므로, 데이터를 불러오는 방법에 대한 상세 설명은 생략합니다.

# API 이용 방법은 다음 링크를 참고해 주세요. [바로 가기 클릭!]

 

01-2. 비트코인 자동 매매 트레이딩 봇: 너무 쉬운 API, 이해하고 사용해요

비트 코인 자동 매매 트레이딩 프로그램 만들기라니, 생에 첫 개인 프로젝트를 시작하면서 너무 어려운 걸 선택했나..라는 생각도 들었습니다. 그러나, 역시 집단 지성은 최고입니다. 온라인 상

zero-coding.tistory.com

 

 

Step 2. plot( ) 메소드로 그래프 그리기: 선(line) 그래프

판다스(Pandas)의 데이터 형태인 시리즈(series)와 데이터 프레임(DataFrame)은 plot 메소드를 지원합니다.

따라서 DataFrame.plot() 또는 Serise.plot() 명령어 만으로도 아주 쉽게 그래프를 그릴 수 있습니다.

매직 커맨드 입력

본격적으로 데이트를 플롯 하기 전, 매직 커맨드 %matplotlib inline를 입력하시길 바랍니다.
매직 커맨드는 보통 주피터에서 자주 사용하며, 어떤 작업을 처리할 때 마법처럼 편리한 기능을 제공하는 커맨드입니다.
%matplotlib inline는 그래프 플롯 시, 별도의 show() 명령어가 없어도
주피터 노트북의 브라우저 상에서 그래프를 즉시 출력합니다.

 

# 참고

그래프에 대한 몇 가지 매직 커맨드입니다.

%matplotlib notebook

그래프를 주피터 노트북 브라우저 상에 바로 출력하며, 확대 및 축소와 같은 동적인 기능을 제공합니다.

%matplotlib tk

실행하고 있는 주피터 노트북 브라우저가 아닌, 별도의 창에서 그래프를 출력합니다.

%matplotlib qt5

%matplotlib tk와 기본적으로 같으며, 부가 설정 기능들이 좀 더 디테일합니다.

 

plot( ) 사용

명령어는 간단합니다.
불러온 데이터(데이터 프레임)의 이름을 앞에 적고, 뒤에 .plot()만 적어 주면 됩니다!

%matplotlib inline

df_day.plot( )

.plot() 실행 결과

 

 

짠! Step.1에서 호출한 모든 가격 정보들과 거래량이 한 번에 플롯 되었습니다. :)
plot()에 조건(파라미터)을 아무것도 적지 않으면, 기본 설정인 꺾은선(line) 그래프를 의미하며
데이터 프레임이 가지고 있는 모든 값을 플롯 합니다.

 

이 중, 필요한 특정 필드의 값만 가져와서 그래프를 만들고 싶다면,
파라미터 값으로 y 축에 원하는 필드명을 리스트로 지정해 주면 됩니다.

df_day.plot(y=['open', 'close'])

특정 필드에 대한 .plot() 실행 결과

 

 

여기까지만 하여도 사실상 그래프는 완성이긴 합니다.
하지만 plot의 설정 파라미터에 대해 알아보고 연습해 볼 겸, 그래프를 좀 더 꾸며봅시다.

 

  • 예시로 진행한 설정은 다음과 같습니다.
    • y축 로그(log) 스케일 사용: logy
    • y축 최대, 최솟값 설정: ylim
    • 그래프 그리드 생성: grid
    • x, y 축 레이블(이름) 표시: xlabel, ylabel
    • 그래프 전체 크기 설정: figsize
    • 마커(marker) 표시 및 마커 크기 설정: mrker, ms
df_day.plot(y=['open', 'close'], logy=True, ylim=(30000000, 100000000), figsize=(10, 6), grid=True, xlabel="Date", ylabel="Price * 10^7 (KRW)", marker='o', ms=3)

plot의 파라미터 설정 후 그래프 결과

 

 

전체 코드를 정리하면 다음과 같습니다.

%matplotlib inline
import pyupbit

df_day = pyupbit.get_ohlcv("KRW-BTC", interval="day", count=100)

df_day.plot(y=['open', 'close'], logy=True, ylim=(30000000, 100000000), figsize=(10, 6), grid=True, xlabel="Date", ylabel="Price * 10^7 (KRW)", marker='o', ms=3)

 

 

테스트한 것 외에도 plot 메소드에 대한 다양한 파라미터들이 있으므로, 아래 링크 참고하시면 도움이 되실 거예요

# Pandas.DataFrame.plot( ) 매뉴얼 가이드

 

pandas.DataFrame.plot — pandas 1.2.4 documentation

Name to use for the xlabel on x-axis. Default uses index name as xlabel, or the x-column name for planar plots. Changed in version 1.2.0: Now applicable to planar plots (scatter, hexbin).

pandas.pydata.org

 

 

Step 3. pyplot(plt)으로 그래프 그리기: 막대(bar) 그래프

Step 2. 에서 사용했던 DataFrame.plot( ) 명령어로도 손쉽게 막대(bar) 그래프를 그릴 수도 있습니다.

plot의 조건 파라미터에 kind="bar"라고만 적으면 됩니다.

df_day.plot(kind='bar',y=['volume'])

 

그러나 이번에는 Matplotlib의 pyplot사용하는 법을 알아보려고 합니다.

 

Matplotblib에서 pyplot 가져오기

라이브러리를 가져오기 위해 import 명령어를 아래와 같이 적어주세요.
pyplot에 대한 약자를 보통 plt이라고 사용합니다.

import matplotlib.pyplot as plt		#matplotlib 라이브러리에서 pyplot을 plt라는 이름으로 가져오세요

 

pyplot(plt) 사용

판다스에서 데이터 프레임(표 형태의 2차원 배열)을 즉시 시각화 해준 plot메소드와 달리,
pyplot시퀀스 스칼라(sequence of scalar)를 지원합니다.
시퀀스 스칼라(sequence of scalar)는 "순서가 있는 숫자"로써,
리스트(list) 또는 넘파이의 시리즈(series)와 같은 데이터 유형을 의미합니다.

 

따라서, x와 y 축에 플롯 하고 싶은 데이터리스트(list)로 저정해야 합니다.
그리고 pyplot(plt)은 그래프를 그리기 위한 조건 설정을 한 줄 한 줄 따로 적어주어야 합니다.

 

위와 같은 내용을 바탕으로 거래량의 바(bar) 그래프를 그리기 위한 전체 코드를 작성해 보면 다음과 같습니다.

import matplotlib.pyplot as plt

xs=df_day.index.to_list()			#dy_day(데이터 프레임)의 index(날짜, 시간)를 리스트로 저장 
ys=df_day['volume'].to_list()			#dy_day(테이터 프레임)의 volume 필드를 리스트로 저장

plt.figure(figsize=(10, 6))			#그래프 크기 지정
plt.xlabel('Date')				#그래프 x축 이름(label) 지정
plt.ylabel('Volume')				#그래프 y축 이름(label) 지정

plt.bar(xs, ys, width=0.6, color='grey')	#리스트로 저장한 xs와 ys로 막대(bar) 그래프 플롯 

 

 

이대로 끝내기가 왠지 아쉬워서 2개 그래프를 같이 그려보았습니다. 이때 유용한 함수가 subplot입니다.
subplot 함수와 함께, 위에서 그려보았던 2가지 그래프를 모두 plt만을 사용해서 플롯 해 보았습니다.

xs=df_day.index.to_list()					#플롯할 데이터 모두 list로 저장
ys_open=df_day['open'].to_list()
ys_close=df_day['close'].to_list()
ys_volume=df_day['volume'].to_list()

plt.figure(figsize=(10, 8))					#전체 그래프 크기 설정

plt.subplot(2,1,1)						#2행 1열에서 1번째 그래프 지정
plt.plot(xs, ys_open, 'o-', ms=3, lw=1, label='open')		#xy데이터 플롯-line
plt.plot(xs, ys_close, 'o-', ms=3, lw=1, label='close')		#xy데이터 플롯	
plt.ylim(30000000, 100000000)					#y축 최대, 최소값
plt.yscale('log')						#y축 로그스케일 설정
plt.xlabel('Date')						#x축 이름 
plt.ylabel('Price * 10^7 (KRW)')				#y축 이름
plt.legend()							#범례 표시

plt.subplot(2,1,2)						#2행 1열에서 2번재 그래프 지정
plt.bar(xs, ys_volume, color='grey', label='volume')		#xy데이터 플롯-bar
plt.xlabel('Date')						#x축 이름
plt.ylabel('Volume')						#y축 이름
plt.legend()							#범례 표시

최종 그래프 완성!

 

 

코드가 길고 왠지 복잡해 보여서 어렵게 느껴질 수도 있지만, 한번 따라 적어 보시거나
한 줄씩 천천히 읽어 보시면 의외로 간단합니다! 각 코드마다 주석도 달아 놓았으니 이해하기 어렵지 않으실 거예요.👍
위 코드 중, 추가 설명할 것은 plt.plot 에 있는 몇 가지 파라미터 밖에 없습니다. 🤣

plt.plot(xs, ys_open, 'o-', ms=3, lw=1, label='open')

 

  • 'ㅇ-' : 원형 마커와 실선
  • ms : 마커 크기
  • lw : 라인 굴기
  • label : 범례 이름

 

아래 링크에서 plt.plot()에 대한 모든 사용법이 정리되어 있으니, 필요할 때 찾아 사용하면 됩니다! 😁

 

#matplotlib.pyplot.plot 매뉴얼 가이드

 

matplotlib.pyplot.plot — Matplotlib 3.4.1 documentation

Parameters: x, yarray-like or scalarThe horizontal / vertical coordinates of the data points. x values are optional and default to range(len(y)). Commonly, these parameters are 1D arrays. They can also be scalars, or two-dimensional (in that case, the colu

matplotlib.org

 

 


 

 

여기까지 파이썬 판다스 plotmatplotlib의 pyplot(plt)그래프 그리기를 실습해보았습니다.
처음에는 판다스 데이터 프레임에서 plot 메소드를 사용하는 방법이 더 쉽다고 생각하였는데,
직접 pyplot(plt)으로 그려보니, 후자의 방법이 훨씬 편하네요!

 

머릿속에 그린 그림을 단계 별로 적어 나가면서 코드를 작성함으로써 하나씩 정리가 되는 점도 있고,
코드를 다시 읽었을 때 한 줄이 짧다 보니 가독성이 아주 좋습니다.
데이터 프레임을 빠르게 그래프로 그려서 확인이 필요할 때에는 DataFrame.plot()이 효율적이며
디테일한 설정이 필요할수록 pyplot(plt)이 효과적인 것으로 보입니다. 😊

 

반응형