Bokeh 中带有 CategoricalAxis 的多线轴标签?
Multiline axis label with CategoricalAxis in 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)
上面的代码产生了下面的情节:
你可以清楚地看到最后一个标签没有正确换行,我还没有弄清楚如何让它换行并创建一个多线轴标签。是否有捷径可寻?我想出的最佳替代解决方案是尝试使用垂直标签,但如您所见,它们看起来不太好,并且弄乱了文本下方的第二个轴:
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)
现在图形如下所示:
当然,一个简单的解决方法是切换轴的顺序,使数字在上,标签在下;然而,这仍然是一个随意的解决方案,并不是我真正想要的。我真的很想在标签中换行。例如,下面的图类似于我想要完成的(下面这个非散景图的代码可以找到 here)。
如有任何帮助或建议,我们将不胜感激!
库存散景轴模型无法使用多行标签。为了实现这一点,您必须创建一个自定义 Axis
子类并自行管理所有包装,因为 canvas
上下文不以任何方式支持它。
作为替代方案,您可以尝试倾斜标签。这种方法的一个缺点是必须找出绘图的正确偏移量以确保标签不会被切断。
自从过去的几个版本(我相信是从 3.3 开始)以来,多线标签一直在散景中工作。您需要在标签字符串的适当位置自行添加换行符'\n'。
我正在制作散景图,并且几乎达到了我想要的效果。但是,我正在努力添加多线轴标签。
这是我目前的情况:
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)
上面的代码产生了下面的情节:
你可以清楚地看到最后一个标签没有正确换行,我还没有弄清楚如何让它换行并创建一个多线轴标签。是否有捷径可寻?我想出的最佳替代解决方案是尝试使用垂直标签,但如您所见,它们看起来不太好,并且弄乱了文本下方的第二个轴:
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)
现在图形如下所示:
当然,一个简单的解决方法是切换轴的顺序,使数字在上,标签在下;然而,这仍然是一个随意的解决方案,并不是我真正想要的。我真的很想在标签中换行。例如,下面的图类似于我想要完成的(下面这个非散景图的代码可以找到 here)。
如有任何帮助或建议,我们将不胜感激!
库存散景轴模型无法使用多行标签。为了实现这一点,您必须创建一个自定义 Axis
子类并自行管理所有包装,因为 canvas
上下文不以任何方式支持它。
作为替代方案,您可以尝试倾斜标签。这种方法的一个缺点是必须找出绘图的正确偏移量以确保标签不会被切断。
自从过去的几个版本(我相信是从 3.3 开始)以来,多线标签一直在散景中工作。您需要在标签字符串的适当位置自行添加换行符'\n'。