자기개발/데이터분석

[plotly] 시계열 시각화 X축 다루기

코대장 2021. 6. 5. 09:45
반응형

[plotly] 시계열 시각화 X축 다루기

서론

python 데이터 시각화를 위한 라이브러리는 대표적으로 matplotlib, seaborn 이 있고, 시각화를 위해 많이 사용하고 있죠.

저는 최근에 plotly 라는 동적 그래프를 그려주는 라이브러리를 알게 되었고 이에 대한 학습을 시작하였습니다.

이번 포스팅에서는

시계열 데이터 시각화 할 때, 중간에 시계열 자료가 비어 있는(?) 경우 matplotlib 과 plotly 시각화 에 대해 소개합니다.

 

본론

*샘플코드를 맨 아래 제공됩니다.

파이썬 라이브러리를 불러오고요.

import pandas as pd
import plotly
import matplotlib.pyplot as plt
import plotly.graph_objects as go

우선, 데이터 프레임을 하나 만들어 보겠습니다.

Time 컬럼에서는 2021년 6월 1일 부터 5일까지 일일 단위로 데이터가 구성되어 있습니다.

sample = {'Index': [1, 2, 3, 4, 5],
          'Time': ["2020-06-01", "2020-06-02", "2020-06-03" ,"2020-06-04" ,"2020-06-05"],
          'Pred': [100, -200, 300, -500, 600]
         }
df = pd.DataFrame(data=sample)

샘플 데이터프레임

이제 matplotlib와 plotly를 통해 시각화 해보겠습니다.

1.1. matplotlib

# matplotlib 그래프 그리기
f, ax = plt.subplots(1,1,figsize=(16,8))
df.plot(x='Time', y='Pred', marker='o', ax=ax)
plt.grid(True)
plt.show()

matplotlib 라이브러리 그래그 그리기

1.2. plotly

# plotly 그래프 그리기
fig = go.Figure()
fig.add_trace(
    go.Scatter(x=df['Time'], y=df['Pred'])
)
fig.show()

plotly를 서론에 말씀드린 것 처럼, 동적인 그래프 시각화 기능이 있습니다.

따라서 마우스를 그래프 위로 올려(hover)두면 각 포인트에 대한 수치값을 보여주죠.

마치 주식 차트처럼요.

plotly 라이브러리 그래프 그리기

 

자, 여기까지는 문제가 없네요.

근데 만약 데이터프레임에서 연속적인 시계열 데이터가 아닌 중간에 하나 비어 있다면 어떻게 될까요?

다시말해, Time 컬럼이 2021년 6월 1일부터 5일까지 중에서 6월 3일자 데이터가 없다면요?

마치 아래처럼요.

sample = {'Index': [1, 2, 4, 5],
          'Time': ["2020-06-01", "2020-06-02", "2020-06-04" ,"2020-06-05"],
          'Pred': [100, -200, -500, 600]
         }
df = pd.DataFrame(data=sample)

샘플 데이터프레임

2.1. matplotlib

# matplotlib 그래프 그리기
f, ax = plt.subplots(1,1,figsize=(16,8))
df.plot(x='Time', y='Pred', marker='o', color='red', ax=ax)
plt.grid(True)
plt.show()

6월 3일 데이터를 삭제하고 matplotlib 으로 그래프를 보면

날짜간 간격이 등간격(동일하게) 그려지고 있습니다. Time 컬럼에 있는 값으로만 그래프를 그린 것이죠.

matplotlib 그래프 그리기

 

 

반응형

 

 

2.2. plotly

그렇다면 plotly는 어떨까요?

# plotly 그래프 그리기
fig = go.Figure()
fig.add_trace(
    go.Scatter(x=df['Time'], y=df['Pred'], line = dict(color='red'))
)
fig.show()

plotly는 matplotlib과 다르게

x축 스케일이 6월 1일부터 5일까지 일일 간격으로 그래프를 그려주네요.

그래서 6월 3일 데이터는 없지만 등간격으로 그려주고 있죠. 

plotly 그래프 그리기

이게 지금 샘플 데이터프레임에서는 짧은기간(6월 1일 ~ 5일)이지만, 데이터량이 커져서 1년 혹은 10년치인 경우에

중간에 10일 혹은 1년치 시계열 자료가 없다면 어떻게 될까요?

예를들면 plotly에서는 아래와 같이 데이터가 없는 부분은 직선으로 그려지게 되겠죠.

plotly 시계열 자료 시각화 문제점

자, 그럼 plotly에서도 matplotlib과 같이 주어진 자료로만 x 축이 스케일링 되게 하려면 어떻게 할까요?

바로 x축을 위한 옵션을 하나 추가 해줘야 합니다. 이제 등간격으로 잘 나오네요.

# plotly 그래프 그리기
fig = go.Figure()
fig.add_trace(
    go.Scatter(x=df['Time'], y=df['Pred'], line = dict(color='green'))
)
# x축 옵션 추가
fig.update_xaxes(
    type='category'
)
fig.show()

plotly 그래프 그리기

 

결론

plotly 시계열 데이터 시각화 할때, x축 스케일링에 대해서 학습해 봤습니다.

plotly 매력적인 도구이지만, 확실히 matplotlib에 익숙해져서인지 아직은 불편하다 느껴지네요.

그만큼 손이 가는 곳(코드로 구현해야하는)도 많이 있구요.

그래도 상황에 따라서는 plotly가 제공해주는 유용한 기능들도 있으니 앞으로도 계속 학습해 나갈 예정입니다.

 

참고자료

https://plotly.com/python/categorical-axes/

 

Categorical Axes

How to use categorical axes in Python with Plotly.

plotly.com

 

소스코드

[plotly] X-Axes.ipynb
0.15MB