2023년 10월 20일 금요일

[2023-10-20] jupyter notebook plot with plotly (인터렉티브 챠트 그리기, feat. 굿즈샵)

jupyter notebook plot with plotly 

인터렉티브 챠트 그리기

안녕하세요. 클스 입니다.

1. 개요


- 데이터 분석을 하다보면 jupyter EDA 과정이나 분석 결과를 시각화하는 데 Jupyter Notebook을 
   많이 사용한다.

- 그런데 matplotlib, seaborn 등을 사용해서 많이 그리게 되는데 문제는 정적인 이미지로 챠트가
   그려지기 때문에 좀 더 세분화하여 보려면 챠트를 다시 그려야 한다.

- 이때 챠트의 범위를 지정하여 세분화를 자동으로 할 수 있게 interactive한 챠트를 그릴 수 있는 것이
   바로 plotly이다. 


2. 소스 및 데이터


- 데이터는 아래와 같이 tm, 001 이다. data.csv 로 저장해둔다

tm,001
2023-10-19 00:00:00,2.071314
2023-10-19 00:10:00,2.0601258
2023-10-19 00:20:00,2.0492716
2023-10-19 00:30:00,2.0405643
2023-10-19 00:40:00,2.0341525
2023-10-19 00:50:00,2.0311875
2023-10-19 01:00:00,2.0286407
2023-10-19 01:10:00,2.0251791
2023-10-19 01:20:00,2.025551
2023-10-19 01:30:00,2.026254
2023-10-19 01:40:00,2.0247104
2023-10-19 01:50:00,2.0253887
2023-10-19 02:00:00,2.0254912
2023-10-19 02:10:00,2.029705
2023-10-19 02:20:00,2.0295382
2023-10-19 02:30:00,2.0286813
2023-10-19 02:40:00,2.028376

- plotly로 시각화 하기

import plotly.express as px
import pandas as pd

df_chart = pd.read_csv('data.csv')
df_chart['tm'] = pd.to_datetime(df_chart['tm'])
df_chart.set_index('tm')

start_dt = df_chart['tm'].iloc[0]
end_dt = df_chart['tm'].iloc[-1]
print(f'{start_dt} - {end_dt}')

fig = px.line(df_chart, x="tm", y="001", title='시각별 2차 압력 ', text="001")
fig.update_xaxes(
# tickvals=pd.date_range(start=start_dt, end=end_dt, freq='6H'),
title_text='시간',
tickangle=-45,
tickformat='%Y-%m-%d(%a) %H:%M',
showticklabels=True,
showspikes=True,
spikemode='toaxis',
ticks="outside",
tickwidth=2,
tickcolor='crimson',
ticklen=10,
)
fig.update_yaxes(title_text='2nd 압력', ticks="outside", tickwidth=2,
tickcolor='crimson', ticklen=10, col=1)
fig.update_traces(textposition="bottom right")
fig.show()

결과



아래 그래프에서 범위를 지정하면 좀더 상세하게 볼 수 있다.




- matplotlib 으로 시각화 하기 (한글을 표시하기위해 나눔고딕 폰트가 필요하다)

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from matplotlib.dates import DateFormatter
from matplotlib import dates

path = '/Library/Fonts/NanumGothic.otf'
fontprop = fm.FontProperties(fname=path, size=18)

df_chart = pd.read_csv('data.csv')
df_chart['tm'] = pd.to_datetime(df_chart['tm'])
df_chart.set_index('tm')

start_dt = df_chart['tm'].iloc[0]
end_dt = df_chart['tm'].iloc[-1]
print(f'{start_dt} - {end_dt}')

# 그래프 그리기
plt.figure(figsize=(20, 5))

# 데이터를 플롯
plt.plot(df_chart['tm'], df_chart['001'], label='Data', color='b')

# X 레이블을 6시간 간격으로 설정
ax = plt.gca()
date_format = DateFormatter("%Y-%m-%d %H:%M(%a)")
ax.xaxis.set_major_formatter(date_format)
ax.xaxis.set_major_locator(dates.HourLocator(interval=3)) # 시간 간격

plt.xticks(rotation=45) # X 레이블의 날짜/시간을 회전하여 가독성 향상

plt.title('시각에 따른 압력 데이터', fontsize=14, fontproperties=fontprop) # 제목 설정
plt.xlabel('시각', fontsize=12, fontproperties=fontprop) # X 레이블 설정
plt.ylabel('2차 압력값', fontsize=12, fontproperties=fontprop) # Y 레이블 설정

plt.legend() # 범례 추가
plt.grid() # 그리드 추가

# 그래프 표시
plt.tight_layout() # 그래프를 화면에 맞게 조정
plt.show()

- 결과


만약 날짜 범위를 조절하려면 소스를 수정해서 다시 그려줘야 한다.


3. 결론


- 인터렉티브한 그래프는 plotly로 그리자.
https://plotly.com/

이상 클스 였습니다.


이것저것 귀여운 것 파는 샵
집순희 굿즈샵 : https://marpple.shop/kr/cutykids?page=0




라벨: , , , , , , , , ,