2017-07-06 15 views
2

非常に長い文字列を持つ因子を持つカテゴリX軸のBokehJSプロットがあります。ラベルはグラフの端で切り取られていますので、短い長さの文字列を生成するために手動または自動で改行文字を挿入したいと考えています(中間に新しい行があるので、 。私は次のコードを試しましたが、外観の変更を作成していないようです。改行文字をBokehJSのカテゴリ軸の因子ラベルに挿入します

p.x_range.attributes['factors'][0] = 'Some very long text string\nthat has now been cut' 

答えて

2

BokehはxaxisティックのCSSレンダリングを追加するか、改行文字のサポートを追加するまでです。ここにあなたが求めていることをすることができる回避策がありますが、それは完璧ではありません。

ファクタ範囲を使用する代わりに、プレースホルダxの値を使用してデータを通常のようにプロットすることができます。次に、y_axisの下にラベルを置くことができます。これらのプレースホルダの位置は、cssによってレンダリングされ、改行を正しく出力します。


ここでは、Bokehサーバーを使用した実例を示します。

main.py

from bokeh.plotting import ColumnDataSource, figure 
from bokeh.models import LabelSet, FixedTicker 
from bokeh.io import curdoc, show 


factors = ["Some very long text string\nthat has now been cut\na", 
      "Some very long text string\nthat has now been cut\nb"] 
y = [50, 40] 

# arbitrary placeholders which depends on the length and number of strings 
x = [0, 2] 
x_label = [0.65, 2.65] # This is offset is based on the length of the string 
y_label = [-2, -2] # offset under the plot 

source = ColumnDataSource(
    data=dict(factors=factors, x=x, y=y, x_label=x_label, y_label=y_label)) 

p = figure(x_range=(-1, 3), y_range=(0, 52)) 

p.circle(x='x', y='y', size=15, fill_color="orange", source=source) 
p.xaxis.ticker = FixedTicker(ticks=x) 

p.xaxis.major_label_text_font_size = '0pt' # turn off x-axis tick labels 
# p.xaxis.major_tick_line_color = None # turn off x-axis major ticks 
p.xaxis.minor_tick_line_color = None # turn off x-axis minor ticks 

labels = LabelSet(x='x_label', y='y_label', text='factors', source=source, 
        level='overlay', render_mode='css', text_align='center') 

p.add_layout(labels) 

curdoc().add_root(p) 

Styles.cssを

.bk-annotation-child { 
    white-space: pre-wrap; 
    text-align: center; 
} 

この方法の主な欠点は、x_labels手動からx軸にオフセットしなければならないことですプレースホルダxの値これは、から呼び出される組み込みのボケのセンタリングが、\nの間の最長のサブストリングではなく、全長ストリングで計算されるためです。私は、あなたがこの答えを試して、プログラマチックに、私がしたように目にするのではなく、任意の文字列の正しいオフセットを判断できると確信しています。

+0

非常に有益で詳細な回答をいただきありがとうございます。私の場合、BokehJS経由でレンダリングするためにJSONにシリアライズするためのPythonコードを生成するのではなく、BohekJSライブラリを使用しています。私はコードを変換することができると思うが、あなたはこのアプローチでいくつかの問題を指摘している。ありがとう。 – David

+0

@Davidあなたの質問を誤解していて、純粋なBokehJSのように謝罪していますが、私はそれほど精通していません。もし私のpythonの回答が解決策を見つけるのを助けたら、それを投稿して自由に感じてください。 – DuCorey

+0

ほとんどの人がPythonにとどまっているので、この答えは他の人にも役立つと思います。この質問は、その文脈でも出てくるかもしれません。おそらく、新しい質問を再投稿し、あなたの答えを提供することは、私が解決策を見つけた後には最高のコースになるでしょう。 – David

関連する問題