2016-05-11 7 views
6

Ich verstehe, wie Sie bestimmte Ticks angeben, die in Bokeh angezeigt werden, aber meine Frage ist, ob es eine Möglichkeit gibt, eine bestimmte Beschriftung zuzuweisen, die gegenüber der Position angezeigt wird. So zum BeispielWie verwende ich benutzerdefinierte Etiketten für Zecken in Bokeh?

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

wird die x-Achsenbeschriftungen bei 0 und 1 nur zeigen, aber was ist, wenn anstatt zu zeigen, 0 und 1 Ich wollte Apple und Orange zeigen. So etwas wie

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

Ein Histogramm funktioniert nicht für die Daten, die ich plotten. Gibt es überhaupt so benutzerdefinierte Etiketten in Bokeh?

Antwort

3

EDIT: Aktualisiert für Bokeh 0.12.5 aber auch einfachere Methode in der anderen Antwort sehen.

Dieser arbeitete für mich:

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

+0

' Skill-Liste und pct_counts wurden erstellt, aber hier nicht gezeigt. <--- Was ist das für irgendjemanden ?????? – dopatraman

+0

Ha, und deshalb haben Sie es abgelehnt? Du hättest das Codeed editieren und stattdessen konstruktiv sein können. – wordsforthewise

+0

Behoben, können Sie jetzt Ihren Downvote rückgängig machen? – wordsforthewise

8

Ab dem letzten Bokeh Versionen (zB 0.12.4 oder neue), das jetzt viel einfacher ist FuncTickFormatter zu erreichen mit:

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

Sieht nützlich aus, aber es gibt mir nur eine leere Seite in meinem Browser. – EddyTheB

+0

Wenn ich mit Bokeh '0.12.4' und' 0.12.5' arbeite, sind weitere Informationen nötig, um herauszufinden, warum das so ist. – bigreddot

+0

Ich war auf 0.12.2, ein Upgrade hat es behoben :-) – EddyTheB