2017-02-21 6 views
2

EDIT: thanks to @tmwilson26 I was able to fix it using javascript code (see comments below). However, I would still be interested to know if there is a solution using from_py_func .Python/Bokeh - FuncTickFormatter

Ich bin mit Bokeh und kämpfen meine Achse zu formatieren FuncTickFormatter verwenden.

Speziell verwende ich die FuncTickFormatter.from_py_func Funktion.

Mein Beispiel unten führt zu keinem Ergebnis (aber auch keine Fehlermeldung).

from bokeh.models import ColumnDataSource,Label, FuncTickFormatter,DatetimeTickFormatter,NumeralTickFormatter, Select, FixedTicker, Slider,TableColumn,DatePicker, DataTable, TextInput, HoverTool,Range1d,BoxZoomTool, ResetTool 
from bokeh.plotting import figure, output_file, show, curdoc 
from bokeh.layouts import row, column, widgetbox, layout 
from bokeh.io import output_notebook, push_notebook, show 

output_notebook() 

x = np.arange(10) 
y = [random.uniform(0,5000) for el in x] 

xfactors = list("abcdefghi") 

yrange = Range1d(0,5000) 

p = figure(x_range = xfactors, y_range = yrange,y_minor_ticks = 10) 
p.circle(x,y, size = 14, line_color = "grey" , fill_color = "lightblue", fill_alpha = 0.2) 


def ticker():  
    a = '{:0,.0f}'.format(tick).replace(",", "X").replace(".", ",").replace("X", ".") 
    return a 

# If I comment below line out, code is running just fine 
p.yaxis.formatter = FuncTickFormatter.from_py_func(ticker) 

show(p) 

Wenn ich die FuncTickFormatter Zeile auskommentieren, läuft der Code gerade gut. Auch die definierte Funktion ticker funktioniert, wenn ich sie außerhalb dieses Codes verwende.

Jeder Rat, was ich falsch mache, wäre sehr hilfreich.

Danke!

+0

Momentan ist 'tick' nicht irgendwo im Programm im inneren Bereich von' ticker' oder im äußeren Hauptbereich definiert. Sollte 'tick' ein Eingabeargument für' ticker' sein? – tmwilson26

+0

Ja, ich weiß. Aber so wie ich die Dokumentation verstehe, muss ich sie nicht definieren (siehe [Bokeh] (http://bokeh.pydata.org/en/latest/docs/user_guide/styling.html#functickformatter). Offensichtlich habe ich nicht t mach es völlig richtig, aber ... – FredMaster

+0

Vielleicht mag meine Version es nicht, weil es 'ValueError zurückgibt: Funktion" func "kann nur ein Argument haben, aber 0 wurden geliefert.' wenn ich' tick' nicht definiere als eine Eingabe.

Das heißt, die Handlung ist immer noch leer, es sei denn, ich formatiere Ihre Zeichenfolge mit '%' anstelle der 'format' Methode – tmwilson26

Antwort

1

Wenn Ihnen Probleme bereitet, versuchen Sie es mit Javascript. Hier ist ein Beispiel unter:

p.yaxis.formatter = FuncTickFormatter(code=""" 
    function(tick){ 
     function markCommas(x) { 
      return x.toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, "X"); 
     } 
     return markCommas(tick).replace('.',',').replace("X",'.') 
    } 
""") 

In einigen der Dokumentation, ist es vielleicht nicht benötigen Sie eine Funktion mit tick als Eingabeargument zu definieren, so dass Sie die äußere Funktion entfernen müssen, aber auf meine Version 0.12.2 , das funktioniert, um Zahlen zu produzieren, wie Sie gefragt haben, z 5.000,0

In der neueren Version, könnte es etwa so aussehen:

p.yaxis.formatter = FuncTickFormatter(code=""" 
    function markCommas(x) { 
     return x.toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, "X"); 
    } 
    return markCommas(tick).replace('.',',').replace("X",'.') 
""") 

Wenn die Unterfunktion nicht funktioniert, hier ist eine einzeilige return-Anweisung:

p.yaxis.formatter = FuncTickFormatter(code=""" 
    return tick.toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, "X").replace('.',',').replace("X",'.'); 
""") 
+0

Funktioniert das auf Ihrem System? Für mich funktioniert es nicht - weder in 'jupyter' noch in' bokeh serve'. Das gleiche wie zuvor: Keine Fehlermeldung, keine Handlung ... – FredMaster

+0

Ja, ist es. Ich habe aber eine ältere Version von Bokeh (das neueste ist 0.12.4 und ich habe 0.12.2), was ich hoffte, wäre kein Problem, aber leider. Versuchen Sie, die äußere Funktion zu entfernen.Ich werde meine Antwort mit dieser Formatierung aktualisieren, so dass Sie sehen können, aber ich kann das nicht auf meiner Version testen, also lassen Sie mich wissen, ob das funktioniert. – tmwilson26

+0

Wenn das nicht funktioniert, vermute ich, dass es wegen der Unterfunktionsdefinition sein wird, die bei Bedarf entfernt werden kann. – tmwilson26