기본 콘텐츠로 건너뛰기

[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




댓글

이 블로그의 인기 게시물

[quaser.dev][2014-09-14] 윈도우즈(10, 64bit)에 개발환경 설정하기

[quaser.dev][2014-09-14] 윈도우즈(10, 64bit)에 개발환경 설정하기

[2024-10-19] iPhone, iPad에서 ChatGPT로 PDF 생성시 한글 깨짐 해결 방법

iPhone, iPad에서 ChatGPT로 PDF 생성 시 한글 깨짐 해결 방법

[2025-04-16(수)] OpenAI gpt-4.1 시리즈 발표, Anthropic Claude에 대한 생각

OpenAI gpt-4.1 시리즈 발표, Anthropic Claude에 대한 생각 안녕하세요. 클스 입니다. 4/15일자로 openai가 gpt-4.1 시리즈를 발표 했습니다. 현재는 api로만 사용가능합니다. 점차 웹/앱 사용자에게 오픈 될거라 생각 됩니다. 비용상 문제로 4.1-mini, nano를 사용해서 chatbot을 만들어 보고 있습니다. 4o 시리즈 보다는 확실히 빠르고, 답변의 정확도는 올라간 것 같습니다. 앤트로픽 클로드와 비교를 많이 하는데, 업무 시스템 혹은 AI 솔루션을 개발하는 입장에서는 어떤 생태계를 제공하는가가 주요한 결정 입니다. AI관련 인력을 충분히 보유한 회사의 경우는 어떤걸 사용해도 좋을 결과를 가지겠지만 일반적인 챗봇 개발 절차를 보면 다음과 같이 볼 수 있습니다. 1. 문서를 준비한다. 대부분 pdf, text, markdown 2. 문서를 파싱해서 vectordb에 올린다.     - 별도 벡터디비 구성 필요. 어떤 db를 선택할지 고민 필요     - 어떤 Parser를 사용할지, 텍스트 오버래핑은 얼마가 적당한지 고민 필요        (회사의 문서가 워낙 많고, 다양하면 하나하나 테스트 해서 좋은걸 선택하는 것이 어렵다)     - 유사도 측정은 어떤 알고리즘을 써야할지 고민 필요     - llamaindex도 고민해야 함. 3. RAG flow를 만든다.     - langchain을 쓸지, 각 AI 벤더에서 제공하는 sdk를 쓸지 고민 필요       (대부분 락인이 되지 않으려면 langchain을 사용하면 좋지만, 벤더에 특화면 기능 적용이 늦음) 4. 챗봇 UI 앱을 만든다.     - 답변이 text 로 구성되다 보니. 그래프, 이미지등 복합적인 컨텐츠를 재배치 하여 표현하기 상당히 어렵네요. (이건 제가 실력이 모자라서 .. 패스) ...