データ分析に欠かせない作業である、データの可視化。データ可視化ライブラリ「Bokeh」の基本的な使い方について、調べてみました。

1.   BokehBokehロゴとは

Bokehインタラクティブなグラフを作成できるデータ可視化ライブラリです。Pythonで作られています。

同じくPython製の可視化ライブラリであるmatplotlibseabornと比較して、下記のような特徴があります。

  • グラフを画像ファイルとして生成するのではなく、WEBブラウザで表示できるHTMLファイルやWebアプリとして生成する
  • JavaScriptを使ったインタラクティブなグラフを生成できる
  • グラフをドラッグしてパンしたり、要素や範囲を選択できる
  • ボタンやスライダー等を組み合わせることもできる
  • Python以外にも、ScalaやR、Julia等からも利用可能
  • Jupyter Notebookでの表示にも対応している

ちなみに、Bokehとは写真用語である「ボケ」のことを指す英単語です。

2.   前提としている環境

この記事では、下記の環境を前提としています。

  • Python : Ver.3.x
  • Bokeh : Ver.0.12.3 0.12.6

追記(Ver.0.12.6)

Bokeh 0.12.6での変更点を考慮して、適宜追記をしました。

3.   インストール方法

PythonディストリビューションであるAnacondaを利用するのが一番簡単で、確実です。

もしAnacondaをインストール済みなら、下記のようにcondaコマンドで必要な依存ライブラリを含めてインストールできます。

1
$conda install bokeh

Anacondaを使っていないなら、代わりにpipを使ってPyPIからインストールすることもできます。

1
$pip install bokeh

詳細は、公式ドキュメントを御覧下さい。

4.   サンプルデータのダウンロード

備考

サンプルデータを使用しない場合は、この手順はスキップ可能です。本記事で紹介する例では一部、サンプルデータを使っています。

一部のサンプルデータは、ライブラリをインストールしただけでは使えません。容量が大きい為、別途ダウンロードする必要があります。 下記のコマンドを実行することで、サンプルデータをダウンロードしてインストールできます。

1
$bokeh sampledata

あるいは、Pythonのインタープリタ上で以下を実行してもインストールできます。

1
2
>>> import bokeh.sampledata
>>> bokeh.sampledata.download()

上記いずれかを実行すると、各種サンプルデータがダウンロードされます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Using data directory: /HOME_DIR/.bokeh/data
Downloading: CGM.csv (1589982 bytes)
   1589982 [100.00%]
Downloading: US_Counties.zip (3182088 bytes)
   3182088 [100.00%]
Unpacking: US_Counties.csv
Downloading: us_cities.json (713565 bytes)
    713565 [100.00%]
Downloading: unemployment09.csv (253301 bytes)
    253301 [100.00%]
Downloading: AAPL.csv (166698 bytes)
    166698 [100.00%]
Downloading: FB.csv (9706 bytes)
      9706 [100.00%]
Downloading: GOOG.csv (113894 bytes)
    113894 [100.00%]
Downloading: IBM.csv (165625 bytes)
    165625 [100.00%]
Downloading: MSFT.csv (161614 bytes)
    161614 [100.00%]
Downloading: WPP2012_SA_DB03_POPULATION_QUINQUENNIAL.zip (5148539 bytes)
   5148539 [100.00%]
Unpacking: WPP2012_SA_DB03_POPULATION_QUINQUENNIAL.csv
Downloading: gapminder_fertility.csv (64346 bytes)
     64346 [100.00%]
Downloading: gapminder_population.csv (94509 bytes)
     94509 [100.00%]
Downloading: gapminder_life_expectancy.csv (73243 bytes)
     73243 [100.00%]
Downloading: gapminder_regions.csv (7781 bytes)
      7781 [100.00%]
Downloading: world_cities.zip (646858 bytes)
    646858 [100.00%]
Unpacking: world_cities.csv
Downloading: airports.json (6373 bytes)
      6373 [100.00%]
Downloading: movies.db.zip (5067833 bytes)
   5067833 [100.00%]
Unpacking: movies.db

4.1.   サンプルデータの保存先

デフォルトでは、サンプルデータは$HOME/.bokeh/dataに保存されます。ダウンロード時にそのディレクトリが存在しない場合は、自動的に作成されます。

サンプルデータの保存先を変更する為には、$HOME/.bokeh/configというYAMLファイルを作成して、sampledata_dirというYAMLキーに絶対パスを定義します。

例えば、下記のように記述すれば、サンプルデータは/dir/to/store/bokeh_dataに保存されます。

1
sampledata_dir: /dir/to/store/bokeh_data

5.   3つのインターフェイス

Bokehにはやりたいレベルに合わせて3段階のインターフェイスが用意されています。

追記(Ver.0.12.6)

Bokeh 0.12.6から、bokeh.chartsは別モジュール(bkcharts)に分離されました。Ver.1.0までは、互換性維持の為に引き続きbokeh.chartsも使用することができますが、importする際に下記の警告が表示されます。

BokehDeprecationWarning:
The bokeh.charts API has moved to a separate 'bkcharts' package.

This compatibility shim will remain until Bokeh 1.0 is released.
After that, if you want to use this API you will have to install
the bkcharts package explicitly.
インターフェイス レベル 説明
bokeh.models アプリ開発者向けの最も柔軟なインターフェイス
bokeh.plotting Glyph(グリフ)と呼ばれる図形の構成の為のインターフェイス
bokeh.charts (Ver.0.12.5以前)
bkcharts (Ver.0.12.6以降)
複雑な統計グラフを素早く簡単に作る為のインターフェイス

この記事では、このうちbokeh.charts bkchartsとbokeh.plottingについて、使用例を紹介します。

6.   bokeh.charts bkchartsを使った簡単な例

まずは、高レベルなインターフェースであるbokeh.charts bkchartsを使ってグラフを作成してみます。

6.1.   必要なモジュールのimport

ここでは、Jupyter Notebook環境でグラフを出力することにして、必要な関数をimportします。

1
2
>>> from bokeh.io import output_notebook
>>> from bokeh.io import show

output_notebook関数を一度実行しておけば、そのnotebook内ではshow関数を実行する度にinlineでグラフが表示されます。

3
>>> output_notebook()

下記のような出力が返ってきます。

Bokehロゴ BokehJS successfully loaded.

6.2.   棒グラフ(Bar Chart)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# サンプルデータから人口DataFrameを取得
from bokeh.sampledata.population import load_population
df = load_population()

# 日本のデータに限定する
dfjapan = df[df['Location']=='Japan']

# 棒グラフ関数
# from bokeh.charts import Bar  # Ver.0.12.5以前
from bkcharts import Bar  # Ver.0.12.6以降

# 棒グラフを作成
p = Bar(dfjapan, label='AgeGrp', values='Value', agg='mean', legend=False, title='棒グラフ')

# 結果を出力
show(p)

下記のようなグラフが出力されます。

7.   bokeh.plottingを使った簡単な例

次に、中レベルのインターフェースであるbokeh.plottingを使ってグラフを作成してみます。

7.1.   基本的な流れ

  1. figure関数を使って、新たなプロットオブジェクトを作成する
  2. output_file関数、output_notebook関数、output_server関数等を使って、Bokehにグラフをどう出力するのかを伝える
  3. show関数やsave関数でグラフを出力する

7.2.   必要なモジュールのimport

1
2
3
4
>>> from bokeh.plotting import figure
>>> from bokeh.io import output_notebook
>>> from bokeh.io import show
>>> output_notebook()
Bokehロゴ BokehJS successfully loaded.

7.3.   散布図(Scatter Plot)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# figureで新規プロットを作成
p = figure(plot_width=400, plot_height=400)

p.circle([1, 2, 3, 4, 5],  # 各円のX座標
         [4, 6, 1, 8, 3],  # 各円のY座標
         size=[10, 12, 14, 16, 18],  # 各円の大きさ
         line_color="navy",# 線の色
         fill_color="blue",# 円の色
         fill_alpha=0.5)   # 透明度

show(p)  # 結果を出力

下記のようなグラフが出力されます。

7.4.   線グラフ(Line Plot)

1
2
3
4
5
6
7
8
# figure関数を使って新規プロットを作成(タイトルを指定)
p = figure(plot_width=400, plot_height=400, title="線グラフ")

p.line([1, 2, 3, 4, 5], # X
       [4, 6, 1, 8, 3], # Y
       line_width=2)    # 線の太さ

show(p)  # 結果を出力

下記のようなグラフが出力されます。

7.5.   複数の要素を組み合わせたグラフ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# データ
x = [1, 2, 3, 4, 5]
y = [4, 6, 1, 8, 3]

# figureを使って新規プロットを作成
p = figure(plot_width=400, plot_height=400)

# 同一のプロットオブジェクトに線と円を追加する
p.line(x, y, line_width=2)
p.circle(x, y, fill_color="white", size=8)

show(p)  # 結果を出力

下記のようなグラフが出力されます。