본문 바로가기
실습/파이썬 데이터 분석 및 시각화

Bokeh 패키지

by 이민우 2021. 11. 17.
728x90
반응형

Bokeh

 

Bokeh는 Matplotlib, Seaborn과 마찬가지로 파이썬에서 그래프를 작성하는 라이브러리이다.

 

사실 Matplotlib이나 Seaborn을 사용하면 대부분의 그래프는 출력이 가능하다. 하지만 굳이 Bokeh를 사용하는 이유는 바로 사용자와의 상호작용 때문이다.

 

기본적으로 위의 두 라이브러리들은 출력 후 사용자는 해당 그래프에 대하여 어떤 상호작용, 즉 이벤트를 부여할 수 없다.

 

하지만 그에 비해 Bokeh은 출력된 그래프에 대하여 드래그, 확대 등 다양한 상호작용이 가능하고, 이러한 장점을 강점으로 삼는다.

 

줄여 말하면 Bokeh은 Interactive한 그래프를 그릴 수 있는 패키지이다.

 

선언은 아래와 같다.

from bokeh.plotting import figure
from bokeh.io import show, output_notebook

위의 figure은 matplotlib의 figure와 같다.

 

아래의 show, output_notebook은 출력된 그래프를 해당 노트북 파일 내에서만 사용하고 싶을 때 사용한다.

만약 이를 파일로 별도로 저장하고 싶다면 다음과 같이 사용한다.

from bokeh.plotting import figure, output_file, show

'''
... 그래프 작성
'''

output_file('filename.html')
show(p)

 

 

기본 사용법

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
import numpy as np

p = figure(plot_width = 400, plot_height = 300,
           title = "예제 그래프",
           x_axis_label = 'x', y_axis_label = 'y')

rec_x = [1, 3, 5, 7, 9]
rec_y = [8, 7, 3, 8, 15]
cir_x = [9, 15, 4, 6, 13]
cir_y = [8, 4, 11, 6, 13]
dia_x = [1, 2, 3, 4, 5]
dia_y = [6, 7, 8, 9, 10]

p.square(rec_x, rec_y, size=12, color='blue', alpha = 0.6) #alpha = 반투명도
p.circle(cir_x, cir_y, size=12, color='red')
p.diamond(dia_x, dia_y, size=12, color='green')

output_notebook() #그래프를 현재 보이는 화면에 출력하는 함수
show(p)

 

 

 

꺾은선 그래프 만들기

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
import numpy as np

p = figure(plot_width = 400, plot_height = 300,
           title = "Line 그래프",
           x_axis_label = 'x', y_axis_label = 'y')

x = [1, 3, 5, 7, 9]
y = [8, 7, 3, 8, 15]

p.line(x, y, line_width=2)

output_notebook() #그래프를 현재 보이는 화면에 출력하는 함수
show(p)

 

그런데 때로는 이런 그래프 말고, 계단식 그래프가 필요한 순간이 있다.

그 때는 step을 사용하면 구현 가능하다.

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
import numpy as np

p = figure(plot_width = 400, plot_height = 300,
           title = "Line 그래프",
           x_axis_label = 'x', y_axis_label = 'y')

x = [1, 3, 5, 7, 9]
y = [8, 7, 3, 8, 15]

p.step(x, y, line_width=2)

output_notebook() #그래프를 현재 보이는 화면에 출력하는 함수
show(p)

 

만약 여러 그래프를 한 figure에 그리고 싶다면 아래와 같이 사용

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
import numpy as np

p = figure(plot_width = 400, plot_height = 300,
           title = "Line 그래프",
           x_axis_label = 'x', y_axis_label = 'y')

x = [1, 2, 3, 4, 5]
y = [8, 7, 3, 5, 7]
x2 = [1, 2, 3, 4, 5, 6]
y2 = [1, 6, 2, 5, 2, 1]

p.multi_line([x, x2], [y, y2], 
             color=['firebrick', 'navy'], 
             line_width=2)

output_notebook() #그래프를 현재 보이는 화면에 출력하는 함수
show(p)

 

 

 

바 차트 그리기

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
import numpy as np

p = figure(plot_width = 400, plot_height = 300,
           title = "Bar 그래프",
           x_axis_label = 'x', y_axis_label = 'y')

y = [1, 2, 3, 4, 5]

#vbar : 세로 막대
p.vbar(y,
       width = 0.5,
       bottom = 0,
       top = [1.2, 2.5, 3.7, 4.9, 6.1],
       color = 'red')

output_notebook() #그래프를 현재 보이는 화면에 출력하는 함수
show(p)

p = figure(plot_width = 400, plot_height = 300,
           title = "Bar 그래프",
           x_axis_label = 'x', y_axis_label = 'y')
#hbar : 가로 막대
p.hbar(y,
       height = 0.5,
       left = 0,
       right = [1.2, 2.5, 3.7, 4.9, 6.1],
       color = 'red')

output_notebook() #그래프를 현재 보이는 화면에 출력하는 함수
show(p)

 

 

 

벌집 모양 차트

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
from bokeh.util.hex import axial_to_cartesian #6각형 모양의 차트를 위한 선언
import numpy as np

p = figure(plot_width = 400, plot_height = 300,
           title = "벌집 그래프",
           x_axis_label = 'x', y_axis_label = 'y',
           toolbar_location=None)

q = np.array([0, 0, 0, -1, -1, 1, 1])
r = np.array([0, -1, 1, 0, 1, -1, 0])

p.grid.visible = False

p.hex_tile(q, r, size = 1, fill_color = ['red']*3 + ['blue']*4, line_color='white', alpha = 0.5)

x, y = axial_to_cartesian(q, r, 1, 'pointytop')

p.text(x, y, text=["(%d, %d)" %(q, r) for (q, r) in zip(q, r)],
       text_baseline="middle",
       text_align = "center") #그래프 안에 글자를 그리기 위한 함수


output_notebook() #그래프를 현재 보이는 화면에 출력하는 함수
show(p)

 

위의 경우는 데이터가 많지 않은 경우이다.

만약 데이터가 많다면, 아래와 같이 표현할 수 있다.

 

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
from bokeh.transform import linear_cmap
from bokeh.util.hex import hexbin
import numpy as np

p = figure(plot_width = 400, plot_height = 300,
           title = "대량의 벌집 그래프",
           x_axis_label = 'x', y_axis_label = 'y',
           toolbar_location=None)

n = 50000
x = np.random.standard_normal(n)
y = np.random.standard_normal(n)
bins = hexbin(x, y, 0.1)

p.hex_tile(q = "q", r = "r", 
           size = 0.1, 
           line_color = None,
           source = bins,
           fill_color = linear_cmap('counts', 'Viridis256', 0, max(bins.counts)))

output_notebook()
show(p)

 

 

 

 

 

히스토그램 그래프

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
import numpy as np

p = figure(plot_width = 400, plot_height = 300,
           title = "히스토그램",
           x_axis_label = 'x', y_axis_label = 'y')

n = 10
x = np.linspace(-2, 2, n)
y = x**2
print(y)

p.quad(bottom=y-x**2/10 + 0.5,
       top = y,
       left = x,
       right=x-x**3/10 + 0.3,
       fill_color = 'red',
       line_color = 'black')

output_notebook()
show(p)

 

 

 

네트워크 차트

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
from bokeh.models import GraphRenderer, StaticLayoutProvider, Oval
from bokeh.palettes import Spectral8
import numpy as np
import math

p = figure(plot_width = 400, plot_height = 300,
           title = "네트워크 차트",
           x_range=(-1.1, 1.1),
           y_range=(-1.1, 1.1),
           x_axis_label = 'x', y_axis_label = 'y')

n = 10
node_indices = list(range(n))

graph = GraphRenderer()
graph.node_renderer.data_source.add(node_indices, 'index')
graph.node_renderer.data_source.add(Spectral8, 'color')
graph.node_renderer.glyph = Oval(height = 0.1, width = 0.2, fill_color = 'blue')

graph.edge_renderer.data_source.data = dict(
    start = [0] * n,
    end = node_indices
)

circ = [i*2*math.pi/8 for i in node_indices]
x = [math.cos(i) for i in circ]
y = [math.sin(i) for i in circ]

graph_layout = dict(zip(node_indices, zip(x, y)))
graph.layout_provider = StaticLayoutProvider(graph_layout = graph_layout)

p.renderers.append(graph)
output_notebook()
show(p)

 

 

 

 

구글 지도 출력

 

Bokeh의 특징 중 하나로, 바로 구글 지도를 바탕에 두고 그 위에 그래프를 출력할 수 있다는 점이다.

물론 아무나 할 수 있는 것은 아니고, 아래 URL에서 api 키를 발급받아야 사용할 수 있다.

https://developers.google.com/maps/documentation/javascript/get-api-key

 

Using API Keys  |  Maps JavaScript API  |  Google Developers

Send feedback Using API Keys Google Maps Platform products are secured from unauthorized use by restricting API calls to those that provide proper authentication credentials. These credentials are in the form of an API key - a unique alphanumeric string th

developers.google.com

 

apikey를 발급받았으면, 아래의 코드 중 'apiKey'에 해당 키를 넣고 다음의 코드를 돌리면 아래와 같이 수원영통역의 위치가 표시된다.

from bokeh.plotting import figure
from bokeh.io import show, output_notebook
from bokeh.models import ColumnDataSource, GMapOptions
from bokeh.plotting import gmap

import numpy as np
import math

map_option = GMapOptions(lat = 37.251675, lng = 127.071319, map_type = 'roadmap', zoom=17) #구글맵 설정

p = gmap('apiKey', map_option, title = '수원영통역')

source = ColumnDataSource(
    data = dict(
        lat = [37.251638, 37.251914, 37.251128],
        lon = [127.071844, 127.070546, 127.070621]
    )
)

p.circle(x='lon', y='lat', size = 30, fill_color = 'blue', fill_alpha=0.4, source = source)

output_notebook()
show(p)

728x90
반응형

'실습 > 파이썬 데이터 분석 및 시각화' 카테고리의 다른 글

Nltk_영어 텍스트 분석  (0) 2021.11.18
Konlpy_한글 텍스트 분석  (0) 2021.11.18
Seaborn 사용법  (0) 2021.11.17
Matplotlib 사용법  (0) 2021.11.17
Pandas 사용법  (0) 2021.11.17