2017-02-21 20 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

Я использую Bokeh и изо всех сил пытаюсь отформатировать ось, используя FuncTickFormatter.

В частности, я использую функцию FuncTickFormatter.from_py_func.

Мой приведенный ниже пример кода не дает никакого результата (но также и сообщения об ошибке).

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) 

Если я прокомментирую строку FuncTickFormatter, код будет работать нормально. Также определенная функция ticker работает, если я использую ее вне этого кода.

Любые советы о том, что я делаю неправильно, были бы очень полезными.

Спасибо!

+0

Прямо сейчас, 'tick' не определен нигде в программе во внутренней области« тикер »или в основной внешней области. Должен ли 'tick' быть входным аргументом для' ticker'? – tmwilson26

+0

Да, я знаю. Но так, как я понимаю документацию, мне не нужно ее определять (см. [Bokeh] (http://bokeh.pydata.org/en/latest/docs/user_guide/styling.html#functickformatter). Очевидно, t получить его полностью прав, хотя ... – FredMaster

+0

Возможно моя версия не нравится, потому что он возвращает 'ValueError: Function" func "может иметь только один аргумент, но 0 были поставлены.' если я не определяю 'tick' в качестве входных данных.Таким образом, сюжет по-прежнему пустой, если я не переформатирую вашу строку, используя '%' вместо метода 'format'. – tmwilson26

ответ

1

Если from_py_func дает вам проблемы, попробуйте использовать прямой Javascript. Вот пример ниже:

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",'.') 
    } 
""") 

В некоторых из документации, она не может понадобиться вам определить функцию с tick в качестве входного аргумента, так что вам, возможно, придется удалить, что внешнюю функцию, но на моей версии 0.12.2 , это работает для создания чисел, как вы просили, например 5.000,0

В новой версии, это может выглядеть примерно так:

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",'.') 
""") 

Если подфункция не работает, вот одна линия оператор возврата:

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

Работает ли это на вашей системе. Для меня он не работает - ни в 'jupyter', ни при использовании' bokeh serve'. То же, что и раньше: нет сообщения об ошибке, нет графика ... – FredMaster

+0

Да, это так. У меня есть более старая версия bokeh (последняя - 0.12.4, а у меня 0.12.2), которая, я надеюсь, не будет проблемой, но, увы. Попробуйте удалить внешнюю функцию.Я буду обновлять свой ответ с этим форматированием, чтобы вы могли видеть, но я не могу проверить это в своей версии, поэтому дайте мне знать, если это сработает. – tmwilson26

+0

Если это не сработает, я подозреваю, что это будет связано с определением подфункции, которое может быть удалено при необходимости. – tmwilson26

 Смежные вопросы

  • Нет связанных вопросов^_^