在Bokeh中使用CategoricalAxis的多线轴标签?

问题描述 投票:0回答:1

我正在做一个Bokeh图,并且几乎按照我的要求来做。但是,我在添加多行轴标签时遇到了困难。

以下是我目前所做的。

import bokeh.io
from bokeh.plotting import gridplot, figure, output_file, show, output_notebook
from bokeh.models import ColumnDataSource, BoxAnnotation, CategoricalAxis, FactorRange
from bokeh.embed import components

x = ['label1','label2','label3','label4','label5','label6','label7', 'Trying for a multiline label']
y = [1.0, 2.7, 1.2, 4.5, 1.5, 2.2, 1.8, 4.6]
p = figure(x_range=[*x], y_range=(0, 5), plot_height=400, plot_width=550)
dots = p.circle(x=x, y=y, color='black',size=10)
line = p.line(x=x, y=y, color='black')

numbers = [str(x) for x in y]
p.extra_x_ranges = {"extra_numbers": FactorRange(factors=numbers)}
p.add_layout(CategoricalAxis(x_range_name="extra_numbers"), 'below')
p.title.text = 'Plot'
p.title.text_font_size = "25px"
p.title.text_color = "black"
p.title.align = "center"

low_box = BoxAnnotation(top=2, fill_alpha=0.1, fill_color='green')
mid_box = BoxAnnotation(bottom=2, top=3, fill_alpha=0.1, fill_color='orange')
high_box = BoxAnnotation(bottom=3, fill_alpha=0.1, fill_color='red')

p.add_layout(low_box)
p.add_layout(mid_box)
p.add_layout(high_box)

show(p)

上面的代码产生了下面的图enter image description here

你可以清楚地看到最后一个标签没有正确地缠绕起来 我还没有弄清楚如何让它缠绕起来并创建一个多行轴标签。有什么简单的方法可以做到这一点吗?我想出的最好的替代方案是尝试使用垂直标签,但正如你所看到的,它们看起来不是很好,并且弄乱了文本下面的第二个轴。

from bokeh.models import CategoricalAxis, FactorRange
from bokeh.plotting import figure, show
from math import pi

x = ['label1','label2','label3','label4','label5','label6','label7', 'Trying for a multiline label']
y = [1.0, 2.7, 1.2, 4.5, 1.5, 2.2, 1.8, 4.6]
p = figure(x_range=[*x], y_range=(0, 5), plot_height=900)
dots = p.circle(x=x, y=y, color='black',size=10)
line = p.line(x=x, y=y, color='black')
p.xaxis.major_label_orientation = pi/2
p.xaxis.major_label_text_font_size = "1.4em"

p.xaxis.axis_line_width = 2
p.yaxis.axis_line_width = 2
numbers = [str(x) for x in y]
p.extra_x_ranges = {"extra_numbers": FactorRange(factors=numbers)}
p.add_layout(CategoricalAxis(x_range_name="extra_numbers"), 'below')
show(p)

现在这个图看起来是这样的enter image description here

当然,一个简单的解决方法是,改变轴的顺序,让数字在上面,标签在下面;然而,这仍然是一个草率的解决方案,而且不是我真正想要的。我很希望标签中能有文字包装。例如,下面的图就和我想实现的类似(下面这个非Bokeh图的代码可以找到 此处).enter image description here

任何帮助或建议都将是非常感激的!

python data-visualization visualization bokeh
1个回答
1
投票

原有的Bokeh轴模型无法实现多线标签。为了实现这一点,你必须创建一个自定义的 "多线标签"。Axis 子类,并且自己管理所有的包装,因为 canvas 上下文根本不支持它。

作为一种替代方法,你可以尝试使用倾斜的标签。这种方法的一个缺点是必须计算出正确的图形偏移量,以确保标签不会被切断。

© www.soinside.com 2019 - 2024. All rights reserved.