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?
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)
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)
[~ # ~] 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)