
bokeh를 활용한 인터랙티브 시각화 기초 - 꺾은선, 산점도, 막대그래프
들어가며
bokeh는 인터랙티브한 웹 기반 시각화를 위한 파이썬 패키지입니다. matplotlib처럼 정적인 이미지 대신, 웹 브라우저에서 동적인 시각화를 제공합니다. 이 글에서는 bokeh의 다양한 기능 중 간단한 시각화를 할 수 있는 plotting에 대해 소개합니다. 다음 예제 데이터를 활용하여 꺾은선 그래프, 산점도, 막대그래프를 시각화하겠습니다.
예제 데이터
예제 데이터는 scikit-learn의 캘리포니아 주택 가격 데이터셋을 활용합니다.
import pandas as pd
from sklearn.datasets import fetch_california_housing
california = fetch_california_housing()
df = pd.DataFrame(california.data, columns=california.feature_names)
df['MedHouseVal'] = california.target
df.head()

bokeh 패키지
pip를 활용하여 bokeh 패키지를 설치하고, import 합니다. bokeh는 plotting, models, server 등 다양한 모듈이 있지만, 기초 시각화는 plotting으로 충분히 가능합니다.
# ! pip install bokeh
from bokeh.plotting import figure, show, output_file
꺾은선 그래프
HouseAge(주택 연식)을 기준으로 MedHouseVal(주택 가치)의 평균에 대한 꺾은선 그래프는 다음과 같습니다. figure 객체를 생성 후, line, circle 메서드를 활용합니다.
- output_file : html 파일 저장
- title.text_font_size : 제목 폰트 크기
- title.align : 제목 위치
- xaxis.axis_label_text_font_size : x축 폰트 크기
- yaxis.axis_label_text_font_size : y축 폰트 크기
- show : 웹 브라우저 열림
output_file("line_plot.html")
# HouseAge를 기준으로 그룹화하여 평균 주택 가치 계산
line_df = df.groupby('HouseAge')['MedHouseVal'].mean().reset_index()
# 꺾은선 그래프 그리기
line_plot = figure(
title="주택 연식별 평균 주택 가치",
x_axis_label='HouseAge (주택 연식)',
y_axis_label='Average MedaHouseVal (평균 주택 가치)',
tools="pan,box_zoom,reset,hover,save",
width=1000, height=700
)
# 제목 폰트 설정
line_plot.title.text_font_size = '14pt'
line_plot.title.align = 'center'
# x, y축 폰트 설정
line_plot.xaxis.axis_label_text_font_size = '12pt'
line_plot.yaxis.axis_label_text_font_size = '12pt'
line_plot.line(line_df['HouseAge'], line_df['MedHouseVal'], line_width=2)
line_plot.circle(line_df['HouseAge'], line_df['MedHouseVal'], size=5, color='navy', alpha=0.6)
show(line_plot)

tools 파라미터
위의 figure의 tools 파라미터는 그래프에 포함할 인터랙티브 도구를 의미합니다. 그래프의 우측에서 도구를 확인할 수 있습니다. 다음의 코드는 팬, 줌, 초기화, 호버툴팁, 저장 기능이 포함된 그래프를 의미합니다. 이 외에도 다양한 tools를 추가할 수 있습니다.
tools = "pan, box_zoom, reset, save, hover"

산점도
MedInc(중간소득)과 MedHouseVal(주택가치)를 활용한 산점도는 다음과 같습니다. figure 객체를 생성 후, circle 메서드를 활용합니다.
output_file("scatter_plot.html")
# 산점도 그리기
scatter_plot = figure(
title="소득 vs 주택 가치 (확대버전)",
x_axis_label='MedInc (중간소득)',
y_axis_label='MedHouseVal (주택가치)',
tools="pan,box_zoom,reset,hover,save",
width=1000, height=700
)
# 제목 폰트 설정
scatter_plot.title.text_font_size = '14pt'
scatter_plot.title.align = 'center'
# x, y축 폰트 설정
scatter_plot.xaxis.axis_label_text_font_size = '12pt'
scatter_plot.yaxis.axis_label_text_font_size = '12pt'
scatter_plot.circle(
df["MedInc"], df["MedHouseVal"],
size=5, alpha=0.5, color="navy"
)
show(scatter_plot)

막대그래프
AveRooms(평균 방 개수)를 기준으로 MedHouseVal(주택 가치)의 평균에 대한 막대그래프는 다음과 같습니다. figure 객체를 생성 후, vbar 메서드를 활용합니다.
output_file("bar_plot.html")
# AveRooms 정수화하여 그룹화. 평균 주택 가치 계산
df['AveRooms_int'] = df['AveRooms'].astype(int)
bar_df = df.groupby('AveRooms_int')['MedHouseVal'].mean().reset_index()
bar_plot = figure(
title="평균 방 개수별 평균 주택 가치",
x_axis_label='AveRooms (평균 방 개수)',
y_axis_label='Average MedHouseVal (평균 주택 가치)',
tools="pan,box_zoom,reset,hover,save",
width=1000, height=700
)
# 제목 폰트 설정
bar_plot.title.text_font_size = '14pt'
bar_plot.title.align = 'center'
# x, y축 폰트 설정
bar_plot.xaxis.axis_label_text_font_size = '12pt'
bar_plot.yaxis.axis_label_text_font_size = '12pt'
bar_plot.vbar(
x=bar_df['AveRooms_int'], top=bar_df['MedHouseVal'],
width=0.9, color="skyblue"
)
show(bar_plot)

그래프 결과 출력: output_file, output_notebook
그래프 결과를 출력하는 함수로 output_file, output_notebook 2가지가 있습니다. output_notebook()은 주피터 노트북에서 결과를 셀 아래에 바로 보여주는 방식입니다. html 파일이 따로 저장되지 않습니다.
from bokeh.plotting import output_notebook, show
output_notebook()
show(p)
output_file()은 그래프를 html 파일로 저장하고, 자동으로 웹 브라우저에서 열립니다. html 파일로 저장하여, 공유와 배포가 용이합니다.
from bokeh.plotting import output_file, show
output_file("my_plot.html")
show(p)
두 함수 모두 동시 사용도 가능합니다.
output_notebook()
output_file("my_plot.html")
show(p)
'Python' 카테고리의 다른 글
| [파이썬] 데이터프레임 행, 열 선택 - iloc, loc (8) | 2025.10.04 |
|---|---|
| [파이썬] MongoDB JSON 데이터 import 및 기본 쿼리 - pymongo (3) | 2025.09.08 |
| [파이썬] 특정 조건에 해당하는 컬럼 선택 - 리스트 컴프리핸션, 정규식 (2) | 2025.07.09 |
| [파이썬] 벌집 Hexbin 그래프 시각화와 Plotly 대체 방법: matplotlib vs plotly (2) | 2025.07.04 |
| [파이썬] 구글 제미나이 Gemini API 활용 방법 - API 키 발급, 예제 (4) | 2025.06.27 |