隗より始めよ

今後はいろいろ考え始めます。

Bokehの棒グラフではまった

f:id:mazarimono:20180628131250j:plain

ここのところmatplotlib一本やりでチャートを作っておりました。

しかし、jupyter notebookを動かすディレクトリをC→Dに動かしたところで問題が・・・。再びmatplotlibで作ったチャートの日本語が豆腐化し始めたのです。

どうして、C→Dにとか思われるかもしれませんが、日々のデータを載せたjupyter bookを残したかったんですよね。あとからフォルダわけしたらよいやんって話ですが、面倒くさがり屋の自分がそんなことをやるわけがないと現時点で気づけたので、最初にやっておきたかったんですよね。

しかし、そうすると再びの豆腐化・・・

との流れから、ふたたびbokehを使うことにしました。しかしそこにはよく分からない問題が待ち構えていました。


もくじ


白ぬけのチャートが表示された

何をいっているか分からないかもしれませんが、全く何も描画されていないバーチャートが表示されました。

バーチャートなんて簡単やろという感じで、下のようなコードを書きました。

from bokeh.io import output_notebook
from bokeh.plotting import figure, show
output_notebook()

p = figure(width=800, height=300)
p.vbar(x = df.index, width = 0.3, top = df['chg'])
show(p)

すると表示されたのは・・・

f:id:mazarimono:20180628125345p:plain

うん。一応ツールは出てるから。でも中身がないな・・・

ちなみに今回扱っているデータは下のようなセクター別株価動向のデータです。インデックスにセクター名、そのほかは数値データが入っています。

f:id:mazarimono:20180628125804p:plain

ドキュメントを見ながら色々試してみる

ローソク足なんかはこのような書き方で良いのですが、何が駄目なのでしょうか?

ドキュメントを見てみます。

bokeh.pydata.org

output_file("bars.html")

fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']

p = figure(x_range=fruits, plot_height=250, title="Fruit Counts",
           toolbar_location=None, tools="")

p.vbar(x=fruits, top=[5, 3, 4, 2, 4, 6], width=0.9)

p.xgrid.grid_line_color = None
p.y_range.start = 0

show(p)

これを見るとfigure(x_range=fruits ・・・)とx_rangeの設定を何か行っていることと、リストのデータを入れているということがわかりました。

というわけでこれが通ったら一番楽に終われそうだと、上のコードにx_range=df.indexを加えてみました。

from bokeh.io import output_notebook
from bokeh.plotting import figure, show
output_notebook()

p = figure(x_range=df.index, width=800, height=300)
p.vbar(x = df.index, width = 0.3, top = df['chg'])
show(p)

すると、一行目を指定して

ValueError: Unrecognized range input: 'Index ~~

と怒られました。

次に、取り扱いたいデータを各々リスト化して、渡すということを試しました。

sectors = []
atai = []

for i in df.index:
    sectors.append(i)
    atai.append(df.loc[i, 'chg'])

p = figure(x_range=sectors, height=300, width=700)
p.vbar(x= sectors, width=0.4, top=atai)
p.xaxis.major_label_orientation = math.pi / 2
show(p)

こうするとなんと動いてくれました。

f:id:mazarimono:20180628130634p:plain

まとめ

エラーが出た場合の対処って難しくて、こうやって書くんやぞってのは載っているけど、僕のと全然違うしなーみたいな感じだとお手上げになります。

結構stackoverflowが解決してくれるわけですが、これって英語でどう書いて検索してよいのかなんてときは、その技も使えません。

そんな時にはオレオレ主義でなく、ドキュメントなどに書かれている感じにデータを作り直すというのが手っ取り早い解決法なのかもしれません。

今回はpandasとの相性が悪かったということなのでしょうか?まぁよく分からないけど、色々あるなと思わされました。

Bokehのよさ

ちょっとだけここでbokehの良さに触れておきますと、拡大縮小などが簡単にできることです。

例えば先日みた散布図だと、重なっているところが何かわかりませんが、bokehだとちょっと拡大してやるだけで、その部分に何があるのかすぐわかります。

f:id:mazarimono:20180628131553p:plain

文字同士が被りすぎて何かわからんなーってなっても安心してください。拡大できますから!

f:id:mazarimono:20180628131808p:plain

というわけでbokehはなかなか便利です。

PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門