2017-02-21 10 views
2

私はBokehを使用しており、FuncTickFormatterを使用して軸をフォーマットするのに苦労しています。Python/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 'は' ticker'の内部スコープ内またはメインのスコープ内でプログラム内のどこにも定義されていません。 'tick 'は' ticker'の入力引数でしょうか? – tmwilson26

+0

はい、わかっています。しかし、ドキュメントを理解する方法は、定義する必要はありません([Bokeh](http://bokeh.pydata.org/en/latest/docs/user_guide/styling.html#functickformatter)を参照してください。明らかに私は、しかし、完全に正しいものを得るには... – FredMaster

+0

おそらく、私のバージョンでは 'ValueError:Function" funcは "引数を1つしか持てませんが、0が与えられました"つまり、 '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",'.') 
""") 

を1行のreturn文は次のとおりです。

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

これはシステムで動作していますか?私にとっては、それはうまくいきません - 「ジュピター」でも「ボケサーブ」でもありません。前と同じ:エラーメッセージもプロットもありません。 – FredMaster

+0

ええ、そうです。私はボケの古いバージョンを持っています(最新は0.12.4で、私には0.12.2があります)。これは問題ではないと思っていましたが、悲しいことです。外側の機能を削除してみてください。私はあなたが見ることができるようにそのフォーマットで私の答えを更新しますが、私は私のバージョンでそれをテストすることはできませんので、それが動作するかどうか教えてください。 – tmwilson26

+0

それがうまくいかない場合は、サブ関数の定義が原因であると思われます。必要に応じて削除することができます。 – tmwilson26