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
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)
'실습 > 파이썬 데이터 분석 및 시각화' 카테고리의 다른 글
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 |