web-dev-qa-db-fra.com

Comment utiliser des étiquettes personnalisées pour les ticks dans Bokeh?

Je comprends comment vous spécifiez des graduations spécifiques à afficher dans Bokeh, mais ma question est de savoir s'il existe un moyen d'attribuer une étiquette spécifique à afficher par rapport à la position. Donc par exemple

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

n'affichera que les étiquettes de l'axe des x à 0 et 1, mais que se passe-t-il si au lieu d'afficher 0 et 1, je voulais afficher Apple et Orange. Quelque chose comme

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

Un histogramme ne fonctionnera pas pour les données que je trace. Est-il possible d'utiliser des étiquettes personnalisées dans Bokeh comme ceci?

19
user3708379

Depuis des versions encore plus récentes de Bokeh (0.12.14 ou plus) c'est encore plus simple. Les graduations fixes peuvent simplement être transmises directement en tant que valeur "ticker", et des remplacements d'étiquettes majeurs peuvent être fournis pour fournir explicitement des étiquettes personnalisées pour des valeurs spécifiques:

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


REMARQUE: l'ancienne version de la réponse ci-dessous fait référence à bokeh.charts API, obsolète et supprimée depuis

Depuis les dernières versions de Bokeh (par exemple 0.12.4 ou plus récent), c'est maintenant beaucoup plus simple à réaliser en utilisant 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

[~ # ~] modifier [~ # ~] : mis à jour pour Bokeh 0.12.5 mais voir aussi la méthode plus simple dans l'autre réponse.

Cela a fonctionné pour moi:

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