Python

[파이썬] bokeh를 활용한 인터랙티브 시각화 기초 - 꺾은선, 산점도, 막대 그래프

weweGH 2025. 7. 16. 09:00
반응형

bokeh 시각화 기초
bokeh 시각화 기초


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()

예제 데이터 df
예제 데이터 df


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"

tools
tools

반응형

산점도


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)

반응형