¿Cómo uso etiquetas personalizadas para ticks en Bokeh?
(2)
A partir de versiones aún más recientes de Bokeh (
0.12.14
o menos), esto es aún más simple.
Las marcas fijas se pueden pasar directamente como el valor "ticker", y se pueden proporcionar anulaciones de etiquetas principales para suministrar explícitamente etiquetas personalizadas para valores específicos:
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)
NOTA: la versión anterior de la respuesta a continuación se refiere a la API
bokeh.charts
, que desde entonces fue obsoleta y eliminada
A partir de las versiones recientes de Bokeh (por ejemplo,
0.12.4
o más reciente), esto es ahora mucho más simple de lograr con
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)
Entiendo cómo especificas ticks específicos para mostrar en Bokeh, pero mi pregunta es si hay una manera de asignar una etiqueta específica para mostrar en comparación con la posición. Así por ejemplo
plot.xaxis[0].ticker=FixedTicker(ticks=[0,1])
solo mostrará las etiquetas del eje x en 0 y 1, pero ¿y si en lugar de mostrar 0 y 1 quisiera mostrar Apple y Orange? Algo como
plot.xaxis[0].ticker=FixedTicker(ticks=[0,1], labels=[''Apple'', ''Orange''])
Un histograma no funcionará para los datos que estoy trazando. ¿Hay alguna forma de usar etiquetas personalizadas en Bokeh como esta?
EDITAR
: actualizado para Bokeh
0.12.5
pero también ve un método más simple en la otra respuesta.
Esto funcionó para mí:
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)