해당 내용은 plotly.py 4.0 출시와 관련된 공식문서를 번역 및 활용하여 작성되었습니다.
최근 공모전이나, 모듈 프로젝트를 진행하면서 데이터 시각화를 해야하는 경우가 많았다.
근데 솔직히... matplotlib를 그대로 사이트에 쓰기에는 너무 안이뻐서ㅠㅠㅠ
추가로 chart.js, D3js 등을 이용해 추가작업을 해야했다.
근데 사실 데이터 분석 다 하고, 이걸 또 d3js같은 이쁜 데이터로 다시 만들면...너무 귀찮은 것이다ㅠㅠㅠㅠ
그래서 세련되고, 이쁜 시각화 그래프를 소개할까 한다.
plotly
plotly는 반응형, 오픈소스 그리고 브라우저 기반 시각화 라이브러리이다. 30개 종류의 차트를 가지고 있고, 3D그래프도 지원한다. 그래서 Chartjs 만큼 이쁘게 시각화 그래프를 그려주곤 한다.
특히 좋았던 점은 저 브라우저 기반 시각화 라이브러리!! html로 코드 변환이 쉬워서 여기저기 웹에 붙이기 너무 좋았다!
1. 설치
pip install plotly==4.10.0
jupyter notebook에서 설치는 조금 다른 듯 하다. jupyter 창에서도 구현할 수 있고, conda prompt에서 설치할수도 있다.
pip install "notebook>=5.3" "ipywidgets>=7.2"
conda install -c plotly plotly==4.1.0
2. 코드 구현해보기
plotly도 기존 matplotlib 함수랑 유사하다. 기본적인 코드는 다음과 같다.
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(y=[2, 1, 4, 3]))
fig.add_trace(go.Bar(y=[1, 4, 3, 2]))
fig.update_layout(title = 'Hello Figure')
fig.show()
이건 matplotlib랑 코드가 조...금! 조금 다르긴 하다! ㅠㅠㅠ
3. PLOTLY EXPRESS
이게 진짜 내가 글을 쓰게 된 계기이다. 사실 처음 공모전할때 plotly를 이용하기 어려웠었다. 막 에러도 엄청 나고...ㅎㅎㅎㅠ
그래서 결국 chartjs로 데이터시각화를 하였다.
그래서 이러한 단점을 보완하고자 최근 Plotly Express라는 독립 실행형 라이브러리가 출시되었었다고 한다!!(Jul 23, 2019).
나는 이걸 몰라서ㅠㅠㅠ 이전 버전 서비스로 해서 너무 어려웠었다. 이를 통해 graph_objects나 offline과 같은 모듈 추가 설치 없이 plotly express만 사용하면 바로 코드를 구현할 수 있다.
또한 matplotlibrary가 plot.bar(data)이렇게 코드를 구현하는 것 처럼 plotly도 px.scatter(), px.bar()로 코드를 구현할 수 있다. (seaborn이랑 좀더 유사하나...?) 물론 변환하는 데이터는 데이터프레임형태로 구현되어 있어야한다!
공식문서에 따르면 plotly express는 splom(scatterplot matrices), 평형좌표 및 병렬 범주 플롯과 같은 다차원 플록, 다면적 생성 애니메이션, 패싯 플롯 및 다차원 플롯을 포함하여 다양한 차트를 지원한다고 나와있다.
사실 뭔말인지 잘 모르겠는데 여튼 위와 같은 많은 그래프를 지원한다고 한다! 짱이다...ㅎㅎㅎ
그리고 옛날에는 plotly를 offline에서 그래프를 그릴 때 plotly.offline.iplot(figure)이렇게 모듈을 이용했어야했는다. express에서는 그냥 바로 구현이 가능하다. 그리고 colab, vscode, jupyternotebook 등 다양한 환경에서 자체적으로 구현된다.
# plotly.offline.iplot을 이용하여 그래프 그리기
import plotly
import plotly.graph_objs as go
init_notebook_mode(True)
df = px.data.iris()
img_name = 'my-plot'
# offline.iplot으로 이미지 출력
plotly.offline.iplot(df, filename=img_name, image='svg')
# plotly.express을 이용하여 그래프 그리기
import plotly.express as px
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
fig.show() # 이것으로 바로 이미지를 확인할 수 있다.
# express로 이미지 출력
fig.write_image()
요약하자면 공식 문서에는 아래와 같은게 변화가 있다고 한다.
- JupyterLab 및 클래식 Jupyter 노트북
- Colab , nteract , Azure & Kaggle 과 같은 다른 노트북
- VSCode , PyCharm , QtConsole 및 Spyder 와 같은 IDE 및 CLI
- 다음과 같은 기타 컨텍스트 sphinx-gallery
- 대시 앱 (사용 dash_core_components.Graph())
- 정적 래스터 및 벡터 파일 (사용 fig.write_image())
- 독립형 대화 형 HTML 파일 (사용 fig.write_html())
- 모든 웹 사이트에 포함 ( fig.to_json()및 Plotly.js 사용 )
또한 subplot도 더 쉽게 그릴 수 있다고 한다. 이건 make_subplots로 구현한다.
from plotly.subplots import make_subplots
fig = make_subplots (rows = 2, cols = 2,
specs = [[{ "type": "xy"}, { "type": "polar"}],
[{ "type": "domain"}, { " type ":"장면 "}]])
fig.add_bar (row = 1, col = 1, y = [2, 3, 1],)
fig.add_pie (row = 2, col = 1, values = [2, 3, 1])
fig.add_barpolar (row = 1, col = 2, theta = [0, 45, 90], r = [2, 3, 1])
fig.add_scatter3d (row = 2, col = 2, x = [2, 3], y = [ 0, 0], z = [0.5, 1])
fig.update_layout (height = 700, showlegend = False)
fig.show ()
4. 코드 없이 chart 그리기
plotly는 또한 google의 DATA STUDIO에서 제공하는 서비스와 유사한 서비스를 제공한다. 물론 DATA STUDIO가 바로바로 GOOGLE DRIVE랑 연동되고, 진짜 편하지만 만약 그게 어려운 사람이라면 여기 서비스를 이용해도 좋을 것 같다!
개인적으로 사용은 안해봤는데, plolty도 무료 서비스를 제공하고 있으니 이용해도 좋을 듯 하다. 특히 코딩 잘 모르는데 데이터 분석을 해야하는 마케터나 기획자들, 또는 구글 데이터스튜디오가 어렵거나 그래프 모양이 맘에 안드는 사람들은 plotly 의 다음 서비스를 추천한다. ㅎㅎㅎㅎ
https://plotly.com/chart-studio/