How do I use custom labels for ticks in Bokeh?

前端 未结 2 1780
耶瑟儿~
耶瑟儿~ 2020-11-30 09:02

I understand how you specify specific ticks to show in Bokeh, but my question is if there is a way to assign a specific label to show versus the position. So for example

相关标签:
2条回答
  • 2020-11-30 09:29

    EDIT: Updated for Bokeh 0.12.5 but also see simpler method in the other answer.

    This worked for me:

    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)
    

    0 讨论(0)
  • 2020-11-30 09:32

    As of even more recent versions of Bokeh (0.12.14 or so) this is even simpler. Fixed ticks can just be passed directly as the "ticker" value, and major label overrides can be provided to explicitly supply custom labels for specific values:

    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)
    


    NOTE: the old version of the answer below refers to the bokeh.charts API, which was since deprecated and removed

    As of recent Bokeh releases (e.g. 0.12.4 or newer), this is now much simpler to accomplish using 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)
    
    0 讨论(0)
提交回复
热议问题