In [17]:
from bokeh.charts import Bar,Scatter,Histogram,BoxPlot
from bokeh.io import push_notebook, show, output_notebook
from bokeh.layouts import gridplot
from bokeh.sampledata.autompg import autompg as df
import pandas as pd
from bokeh.layouts import row,column
from bokeh.models import HoverTool
output_notebook()
Loading BokehJS ...

サンプルデータ

In [2]:
df.head()
Out[2]:
mpg cyl displ hp weight accel yr origin name
0 18.0 8 307.0 130 3504 12.0 70 1 chevrolet chevelle malibu
1 15.0 8 350.0 165 3693 11.5 70 1 buick skylark 320
2 18.0 8 318.0 150 3436 11.0 70 1 plymouth satellite
3 16.0 8 304.0 150 3433 12.0 70 1 amc rebel sst
4 17.0 8 302.0 140 3449 10.5 70 1 ford torino

グラフの動きを同期させる例(Linking Plots)

In [18]:
s1 = Bar(df, 'cyl', values='mpg', title="Total MPG by CYL")
s2 = Bar(df, 'cyl', values='accel', title="Total Accel by CYL")
s2.x_range=s1.x_range
s2.y_range=s1.y_range
p = gridplot([[s1, s2]], toolbar_location=None)
show(p)
# x_rangeを同一にすると横方向に同期、y_rangeを同一にすると縦方向に同期される
In [19]:
s1 = Bar(df, 'cyl', values='mpg', title="Total MPG by CYL")
s2 = Bar(df, 'cyl', values='accel', title="Total Accel by CYL")
s2.x_range=s1.x_range
s2.y_range=s1.y_range
show(row(s1,s2))
#こっちのほうが楽かも。無設定でツール出るし

HoverToolの例(マウスカーソル上にtipが表示される)

In [23]:
hover = HoverTool(tooltips = [('cyl','@cyl'),('name','@name')])
#まずHoveToolのインスタンスを作成する。表示したいカラム名を@で指定する
# ただし、予期したとおり動かないことが多い。例えば、この例では@nameの方は表示されない。
# 詳細は https://github.com/bokeh/bokeh/issues/4347 を参考
# ローレベルのPlotは問題ないが,ハイレベルのChartはModelを使ってdfを再度変換してるようだ。
# また、グラフ描画に不要なデータはClientに送られない。下の例ではname属性はグラフ描画に不要なので、削られてしまい、???になる。
# なお、'car name'のように空白を含むカラム名もエラーになるが、'car_name','@{car name}'という風に{}で囲むと走るらしい
In [24]:
scatter = Scatter(df, x='mpg', y='hp', color='cyl', title="HP vs MPG (shaded by CYL)",
            xlabel="Miles Per Gallon", ylabel="Horsepower",tools = [hover])
show(scatter)

ヒストグラムと散布図

In [20]:
hist = Histogram(df,values='mpg',color='cyl')
show(hist)
In [21]:
box = BoxPlot(df,values='mpg',label='cyl')
show(box)
In [25]:
hist = Histogram(df,values='mpg',color='cyl')
box = BoxPlot(df,values='mpg',label='cyl')
box.y_range = hist.y_range
show(row(hist,box))
#軸のスケールが一致しないと描画エラーになる。ま、そりゃそうだが…