2017-11-27 8 views
0

bokehにカテゴリの棒グラフデータの凡例を表示させたいが、凡例にどのレベルのカテゴリが表示されるかを制御したい。bokeh legendの主要カテゴリのみを表示する

下記のbokehサンプルコードを使用して、私は伝説にほんの数年を表示したいと思います。現在の "Apple、2015"の代わりに "2015"、 "2016"、 "2017"のように表示されます。

さらに、x軸の表示に年を隠そうとしているので、 。

私はしばらくbokehのドキュメントを検索しましたが、これを行う方法はわかりません。私はvbarを作成するときに凡例の属性を何らかの形式の文字列に設定する必要があると思いますが、どの形式が許可されているかわかりません。これを行う適切な方法は何ですか?

from bokeh.io import show, output_file 
from bokeh.models import ColumnDataSource, FactorRange 
from bokeh.plotting import figure 
from bokeh.transform import factor_cmap 

output_file("bars.html") 

fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries'] 
years = ['2015', '2016', '2017'] 

data = {'fruits' : fruits, 
     '2015' : [2, 1, 4, 3, 2, 4], 
     '2016' : [5, 3, 3, 2, 4, 6], 
     '2017' : [3, 2, 4, 4, 5, 3]} 

# this creates [ ("Apples", "2015"), ("Apples", "2016"), ("Apples", "2017"), ("Pears", "2015), ... ] 
x = [ (fruit, year) for fruit in fruits for year in years ] 
counts = sum(zip(data['2015'], data['2016'], data['2017']),()) # like an hstack 

source = ColumnDataSource(data=dict(x=x, counts=counts)) 

p = figure(x_range=FactorRange(*x), plot_height=250, title="Fruit Counts by Year", 
      toolbar_location=None, tools="") 

palette = ["Red", "Green", "Blue"] 
#p.vbar(x='x', top='counts', width=0.9, source=source) 
p.vbar(x='x', top='counts', width=0.9, source=source, line_color="white", 
     fill_color=factor_cmap('x', palette=palette, factors=years, start=1, end=2), 
     # legend='x[0]' 
     legend='x', 
    ) 


p.y_range.start = 0 
p.x_range.range_padding = 0.1 
p.xaxis.major_label_orientation = 1 
p.xgrid.grid_line_color = None 
p.legend.location = "top_right" 

show(p) 

答えて

0

あなたは、階層軸ラベルをしたくない場合は、ユーザーズガイドのHandling Categorical Data章のVisual Dodgeセクションで、メソッドdecribedを使用する必要があります。

私が間違っていない限り、この例では、あなたが求めている正確に何があります:

from bokeh.core.properties import value 
from bokeh.io import show, output_file 
from bokeh.models import ColumnDataSource 
from bokeh.plotting import figure 
from bokeh.transform import dodge 

output_file("dodged_bars.html") 

fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries'] 
years = ['2015', '2016', '2017'] 

data = {'fruits' : fruits, 
     '2015' : [2, 1, 4, 3, 2, 4], 
     '2016' : [5, 3, 3, 2, 4, 6], 
     '2017' : [3, 2, 4, 4, 5, 3]} 

source = ColumnDataSource(data=data) 

p = figure(x_range=fruits, y_range=(0, 10), plot_height=250, 
      title="Fruit Counts by Year", toolbar_location=None, tools="") 

p.vbar(x=dodge('fruits', -0.25, range=p.x_range), top='2015', width=0.2, 
     source=source, color="#c9d9d3", legend=value("2015")) 

p.vbar(x=dodge('fruits', 0.0, range=p.x_range), top='2016', width=0.2, 
     source=source, color="#718dbf", legend=value("2016")) 

p.vbar(x=dodge('fruits', 0.25, range=p.x_range), top='2017', width=0.2, 
     source=source, color="#e84d60", legend=value("2017")) 

p.x_range.range_padding = 0.1 
p.xgrid.grid_line_color = None 
p.legend.location = "top_left" 
p.legend.orientation = "horizontal" 

show(p) 

enter image description here

+0

おかげで多くのことを、あなたは右、これは私が望んでいた外観をexacltれています。しかし、私はデータを少し並べ替える必要があったので、ドッジメソッドを使用しないようにしていましたが、ドッジを明示的に計算して設定する必要がありました。ダッジメソッドのドキュメントでは、入力データがきちんとしたテーブルにない場合に使用するように提案しています。テーブルにテーブルを表示するだけでは、テーブルを分割する必要があります。私は欠けていたx軸ラベルのレベル(または開始深度と終了深さ)を指定する方法があるかもしれないと思っていましたが、そのようなものは何もありません。 – hellobenallan

+0

現在はありませんが、おそらくいくつか合理的な改善が考えられます。現在のカテゴリサポートは、以前の機能よりも大幅に改善されていますが、リファクタリングのための大きなプッシュの結果でもありました。私は[Github Issue](https://github.com/bokeh/bokeh/issues)を開いて新しい機能について議論することをお勧めします。 – bigreddot

+0

それは、感謝のためにたくさんありました!私はAPIがかなり進化しているので、ちょうど2回チェックする方が良いと思ったが、ドッジメソッドは今のところうまくいくはずだ。私は機能要求についても議論するための問題を開くように努力します。 – hellobenallan

関連する問題