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()
df.head()
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 |
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を同一にすると縦方向に同期される
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))
#こっちのほうが楽かも。無設定でツール出るし
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}'という風に{}で囲むと走るらしい
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)
hist = Histogram(df,values='mpg',color='cyl')
show(hist)
box = BoxPlot(df,values='mpg',label='cyl')
show(box)
hist = Histogram(df,values='mpg',color='cyl')
box = BoxPlot(df,values='mpg',label='cyl')
box.y_range = hist.y_range
show(row(hist,box))
#軸のスケールが一致しないと描画エラーになる。ま、そりゃそうだが…