데이터과학 삼학년

Visualization tool - bokeh (feat.falsk) 본문

Web

Visualization tool - bokeh (feat.falsk)

Dan-k 2020. 1. 15. 17:17
반응형

python을 이용하여 시각화 할 수 있는 tool은 너무 많다. 

matplotlib이나 dash, bokeh 등....

이 중 bokeh에 대해 알아보자

 

bokeh는 시각화 툴로 일본에서 만들어졌다고 알고 있다.

bokeh에 dashboard 기능이나 구현면에서 조금은 자유로운 점도 있는 듯하다.

 

코드를 통해 먼저 살펴보자.

import numpy as np
from bokeh.plotting import figure
# Make Bokeh Push push output to Jupyter Notebook.
from bokeh.io import show, output_notebook
from bokeh.resources import INLINE

output_notebook(resources=INLINE) ## jupyter 환경에서 보기 위해서 입력 

# Create some data.
x = np.linspace(0,2*np.pi,20)
y = np.sin(x)

p = figure(title="Simple Line Plot in Bokeh", x_axis_label='x', y_axis_label='y')

# Add a line renderer with legend and line thickness
p.line(x, y, legend="Value", line_width=3)

# Show the results
show(p)

저장이나 확대 등 용이하다.

 

아래는

flask를 이용해 web으로 인자를 받아 생성한 bokeh 그래프이다.

from flask import Flask, render_template, request, redirect,url_for
import pandas as pd

from bokeh.embed import components
from bokeh.plotting import figure
from bokeh.resources import INLINE
from bokeh.util.string import encode_utf8
from bokeh.models import ColumnDataSource
from bokeh.layouts import row, column, gridplot

df = pd.read_csv('data/data.csv')
df = df.set_index('regdatetime')
df.index = pd.to_datetime(df.index)
df.index.name = 'Datetime'
df.sort_index(inplace=True)

app = Flask(__name__)

@app.route('/hello')
def hello():
    return 'Hello guys'

@app.route('/')
@app.route('/input')
def input(condition=None,feature=None):
    return render_template('input.html',condition=condition, feature=feature)

@app.route('/bokeh',methods=['POST'])
def bokeh(condition=None,feature=None):
    if request.method == 'POST':
        condition = request.form['condition']
        feature = request.form['feature']
        
    df['resid'] = df[(df.condition==int(condition)) & (df.part=='resid')][feature]
    df['trend'] = df[(df.condition==int(condition)) & (df.part=='trend')][feature]
    df['seasonal'] = df[(df.condition==int(condition)) & (df.part=='seasonal')][feature]
    source = ColumnDataSource(df)
    fig_lst = []
    for i in ['trend','seasonal','resid'] :
        fig = figure(x_axis_type="datetime")
        fig.line('Datetime',i, source=source)
        fig.title.text = '{}'.format(i.upper())
        fig.xaxis.axis_label = 'TimeStamp'
        fig.yaxis.axis_label = 'Values'
        fig_lst.append(fig)
        
    print(fig_lst)
    grid = gridplot(fig_lst, ncols=1, plot_width=1200, plot_height=250)
    fig = grid
    
    # grab the static resources
    js_resources = INLINE.render_js()
    css_resources = INLINE.render_css()

    # render template
    script, div = components(fig)
    html = render_template(
            'index.html',
            plot_script=script,
            plot_div=div,
            js_resources=js_resources,
            css_resources=css_resources,
        )
    return encode_utf8(html)
    
if __name__ == '__main__':
    app.run(host='0.0.0.0',debug=True,port=5000)

여러개의 bokeh plot을 만들기 위해서는 gridplot을 이용하여 묶어서 표현해주면된다.

아래는 timeseries data를 표현해 보았다.

 

bokeh에 대해 더 자세한 사항은...

https://docs.bokeh.org

 

— Bokeh 1.4.0 documentation

 

docs.bokeh.org

참고고고고

728x90
반응형
LIST
Comments