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
の間の最長のサブストリングではなく、全長ストリングで計算されるためです。私は、あなたがこの答えを試して、プログラマチックに、私がしたように目にするのではなく、任意の文字列の正しいオフセットを判断できると確信しています。
非常に有益で詳細な回答をいただきありがとうございます。私の場合、BokehJS経由でレンダリングするためにJSONにシリアライズするためのPythonコードを生成するのではなく、BohekJSライブラリを使用しています。私はコードを変換することができると思うが、あなたはこのアプローチでいくつかの問題を指摘している。ありがとう。 – David
@Davidあなたの質問を誤解していて、純粋なBokehJSのように謝罪していますが、私はそれほど精通していません。もし私のpythonの回答が解決策を見つけるのを助けたら、それを投稿して自由に感じてください。 – DuCorey
ほとんどの人がPythonにとどまっているので、この答えは他の人にも役立つと思います。この質問は、その文脈でも出てくるかもしれません。おそらく、新しい質問を再投稿し、あなたの答えを提供することは、私が解決策を見つけた後には最高のコースになるでしょう。 – David