bokeh

¿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)