web-dev-qa-db-ja.com

ボケの目盛りにカスタムラベルを使用するにはどうすればよいですか?

ボケに表示する特定の目盛りを指定する方法を理解しましたが、私の質問は、表示する位置に対して特定のラベルを割り当てる方法があるかどうかです。だから例えば

plot.xaxis[0].ticker=FixedTicker(ticks=[0,1])

x軸のラベルは0と1にのみ表示されますが、0と1を表示する代わりにApple and Orange。

plot.xaxis[0].ticker=FixedTicker(ticks=[0,1], labels=['Apple', 'Orange'])

ヒストグラムは、プロットしているデータに対して機能しません。とにかく、このようなボケでカスタムラベルを使用することはありますか?

19
user3708379

より最近のバージョンのボケ(0.12.14程度)これはさらに簡単です。固定ティックは単に「ティッカー」値として直接渡すことができ、メジャーラベルのオーバーライドを提供して、特定の値のカスタムラベルを明示的に提供できます。

from bokeh.io import output_file, show
from bokeh.plotting import figure

p = figure()
p.circle(x=[1,2,3], y=[4,6,5], size=20)

p.xaxis.ticker = [1, 2, 3]
p.xaxis.major_label_overrides = {1: 'A', 2: 'B', 3: 'C'}

output_file("test.html")

show(p)

enter image description here


注:以下の古いバージョンの回答はbokeh.charts AP​​I、廃止されて削除された

最近のBokehリリース(例えば0.12.4以降)、これはFuncTickFormatterを使用して実行する方がはるかに簡単になりました。

import pandas as pd
from bokeh.charts import Bar, output_file, show
from bokeh.models import FuncTickFormatter

skills_list = ['cheese making', 'squanching', 'leaving harsh criticisms']
pct_counts = [25, 40, 1]
df = pd.DataFrame({'skill':skills_list, 'pct jobs with skill':pct_counts})
p = Bar(df, 'index', values='pct jobs with skill', title="Top skills for ___ jobs", legend=False)
label_dict = {}
for i, s in enumerate(skills_list):
    label_dict[i] = s

p.xaxis.formatter = FuncTickFormatter(code="""
    var labels = %s;
    return labels[tick];
""" % label_dict)

output_file("bar.html")
show(p)
21
bigreddot

[〜#〜] edit [〜#〜]:Bokeh 0.12.5用に更新されましたが、他の回答でより簡単な方法も参照してください。

これは私のために働きました:

import pandas as pd
from bokeh.charts import Bar, output_file, show
from bokeh.models import TickFormatter
from bokeh.core.properties import Dict, Int, String

class FixedTickFormatter(TickFormatter):
    """
    Class used to allow custom axis tick labels on a bokeh chart
    Extends bokeh.model.formatters.TickFormatte
    """

    JS_CODE =  """
        import {Model} from "model"
        import * as p from "core/properties"

        export class FixedTickFormatter extends Model
          type: 'FixedTickFormatter'
          doFormat: (ticks) ->
            labels = @get("labels")
            return (labels[tick] ? "" for tick in ticks)
          @define {
            labels: [ p.Any ]
          }
    """

    labels = Dict(Int, String, help="""
    A mapping of integer ticks values to their labels.
    """)

    __implementation__ = JS_CODE

skills_list = ['cheese making', 'squanching', 'leaving harsh criticisms']
pct_counts = [25, 40, 1]
df = pd.DataFrame({'skill':skills_list, 'pct jobs with skill':pct_counts})
p = Bar(df, 'index', values='pct jobs with skill', title="Top skills for ___ jobs", legend=False)
label_dict = {}
for i, s in enumerate(skills_list):
    label_dict[i] = s

p.xaxis[0].formatter = FixedTickFormatter(labels=label_dict)
output_file("bar.html")
show(p)

result of code

4
wordsforthewise