본문 바로가기

Python

[Python]Google Colab.에서 Plotly를 Display하고, html로 저장하는 방법.

반응형

Plotly를 이용해서 오늘 그려볼 Interactive한 그래프이다.

Plotly는 Interactive한 graph를 만들어주는 python package이다. Plotly라는 패키지가 아직까지는 그렇게 유명한 패키지는 아닌 것 같고, 왠만한거 다 깔려있는 구글 Colab.에도 직접 설치를 해서 사용해야되는데 제대로 설명되어있는 곳이 없어 직접 몇군데 돌아다니며 알아봤다. 

 

먼저 chart_studio 를 깔아준다.

!pip install chart_studio

이 안에 plotly package가 포함되어있다고 한다. 

 

다음, cufflinks를 설치해준다. cufflinks를 설치하면 pandas에서 바로 데이터를 plotly로 넘겨서 그래프를 제작해준다! 

필요없으면 생략. 

!pip install cufflinks

이제 설치가 모두 끝났으면, 필요한 패키지를 불러온다.

import numpy as np
import chart_studio
chart_studio.tools.set_credentials_file(username='username',api_key='api_key')
import plotly.graph_objects as go

이제 준비는 끝났고.. 무언가 그려보면 좋을 거 같은데, 예시로 다음과 같은 함수를 생각해보자.

$$ f(x)=\left\{\begin{matrix} 0 \quad 0<x<\lambda/2
\\ 
1 \quad \lambda/2 < x < \lambda
\end{matrix}\right. $$

 

$f(x)$를 Fourier Series로 나타내면, 

$$ f(x) = \frac{4}{\pi} (sinkx + \frac{1}{3} sin3kx + \frac{1}{5} sin5kx + ...) $$의 식을 얻을 수 있다. (그래프 그리기가 목적이므로, 과정은 조금 귀찮으니 생략한다) 

K=1로 두고, 이 그래프를 텀을 늘려가며 어떻게 실제 함수와 비슷해져가는지 interactive하게 그려보자. 

n = 100
x_0 = np.linspace(0,50,n)
y_1 = np.sin(x_0)
y_2 = y_1 + (1/3)*(np.sin(3*x_0))
y_3 = y_2 + (1/5)*(np.sin(5*x_0))
y_4 = y_3 + (1/7)*(np.sin(7*x_0))
y_5 = y_4 + (1/9)*(np.sin(9*x_0))

ㅎㅎ... 5개의 텀만 써보았다. 

그래프를 그려보자.

fig=go.Figure()

fig.add_trace(go.Scatter(x=x_0, y=y_1, mode='lines', name ='term 1'))
fig.add_trace(go.Scatter(x=x_0, y=y_2, mode='lines', name ='term 2'))
fig.add_trace(go.Scatter(x=x_0, y=y_3, mode='lines', name ='term 3'))
fig.add_trace(go.Scatter(x=x_0, y=y_4, mode='lines', name ='term 4'))
fig.add_trace(go.Scatter(x=x_0, y=y_5, mode='lines', name ='term 5'))
fig.write_html("file.html")
fig.show()

자 그리고 이 코드를 실행시키면...!

짜잔.. 아무것도 보이지 않는다. 처음에 살짝 당황했는데, html파일을 Colab이 지원을 안해주는 것 같다. 그래서 file.html로 저장해서 봐야 한다. 

 

저장된 파일을 열어보면, 

 

짜잔! 그래프가 이쁘게 완성되었다. 이 그래프는 interactive하게 반응해서 확대도 마음대로 할 수 있고, 원하는 legend만 골라서 볼 수도 있다. 

 

Plotly 사용법에 대한 자세한 내용은 나중에 (아마도) 다룰 예정이다.


내용 추가: 

Google colab에서 out 창으로 직접 display를 쉽게 할 수 있는 방법을 Stackoverflow에서 찾아 공유하고자 한다. 

Source : https://stackoverflow.com/questions/47230817/plotly-notebook-mode-with-google-colaboratory 

똑같이 chart_studio 를 설치해주고, 

import numpy as np 
import chart_studio 
chart_studio.tools.set_credentials_file(username='username',api_key='api_key') 
import plotly.graph_objects as go
from plotly.offline import iplot, init_notebook_mode

from plotly.offline import iplot, init_notebook_mode 를 추가로 불러와준다. 그리고 다음과 같은 함수를 정의해준다. 

def configure_plotly_browser_state():
  import IPython
  display(IPython.core.display.HTML('''
        <script src="/static/components/requirejs/require.js"></script>
        <script>
          requirejs.config({
            paths: {
              base: '/static/base',
              plotly: 'https://cdn.plot.ly/plotly-1.5.1.min.js?noext',
            },
          });
        </script>
        '''))

Colab notebook에서 render 할 수 있도록 해주는 함수이다. 다음, 그래프를 다음과 같이 그려준다. (아까 그 그래프 5개 그릴거다) 데이터는 똑같으니까, 그리는 부분만 보면, 

configure_plotly_browser_state()
init_notebook_mode(connected=False)

fig=go.Figure()

fig.add_trace(go.Scatter(x=x_0, y=y_1, mode='lines', name ='term 1'))
fig.add_trace(go.Scatter(x=x_0, y=y_2, mode='lines', name ='term 2'))
fig.add_trace(go.Scatter(x=x_0, y=y_3, mode='lines', name ='term 3'))
fig.add_trace(go.Scatter(x=x_0, y=y_4, mode='lines', name ='term 4'))
fig.add_trace(go.Scatter(x=x_0, y=y_5, mode='lines', name ='term 5'))


iplot(fig)

위의 두 부분만 추가되었다! Output 화면은 다음과 같이, plotly 그래프를 정상적으로 colab에 불러와준다. 

plotly graph가 정상적으로 가져와졌다.

다음 소개할 colab notebook은 본인이 만든것은 아니고, 위 방법을 소개해주는 Stackoverflow에 첨부되어있는 notebook이다. 

참고 : https://colab.research.google.com/drive/14oudHx5e5r7hm1QcbZ24FVHXgVPD0k8f#scrollTo=kfzZSdGL1b93

 

Google Colaboratory

 

colab.research.google.com

 


2020. 10. 12 내용 추가 : 

요즘에는 위의 스크립트를 작성하지 않아도 Colab에서 잘 Display되는 것 같다. 혹여 표시가 안될때 위의 방법을 시도해 보면 좋을 것 같다. 외부에서 스크립트를 불러오면 아무래도 전체적으로 느려지기 때문이다.