散景中的标签文本位置

Label text position in Bokeh

我想将 MyText 标签贴在我的图的右下角 对于给定的文本和给定的字体大小(如 'this is super fun' 的图片所示,'20px' 的字体大小和小字符。我通过二分法找到了好的位置)。 我需要传递给 x 的函数位置是什么? 这应该取决于 len(MyText)、text_font_size 和图形宽度 ...

from bokeh.models import ColumnDataSource, Label, LabelSet, Range1d
from bokeh.plotting import figure, output_file, show
width,height=400,300
p = figure(plot_width=width, plot_height=height)
MyText='this is super fun'
my_font_size = "20px"
labels = Label(x=width/2+25, y=0,x_units='screen', y_units='screen', text=MyText,text_font_size=my_font_size)
p.add_layout(labels)
show(p)

实际上,我认为没有任何 100% 可靠的方法可以做到这一点。

您可以将 text_align 设置为 "right" 这有助于:

p = figure(plot_width=width, plot_height=height)
labels = Label(x=width-50, y=0, 
               x_units="screen", y_units='screen', text_align="right", 
               text=MyText,text_font_size=my_font_size)

请注意,上面的 -50 是(粗略地)考虑“绘图区域”(即工具栏所在的位置)右侧 space 的宽度。然而,如果你在左侧添加一个 y 轴,你也需要考虑到这一点,如果你允许缩放,那么 left space 可以增长和收缩以适应更大或更小的轴标签,这意味着你不能 可靠地解释那个 space 前面有一个常量。您可以将 min_border 值设置得更大,这可能会缓解某些 zooming/panning.

范围内的问题

此外,以上假定地块大小调整模式不是“响应式”的。如果绘图本身可以调整大小,那么屏幕单位中的常量值将永远不起作用。

如果您可以修复您的 x 范围 start/end(或添加“额外”范围),那么您可以使用“数据”单位右对齐到范围结束值。但是,如果您允许缩放或平移,则标签将移动以固定在该数据位置。

主要问题是“inner_width”仅在浏览器中计算。它对 Python 代码不可用,因为它不存在于浏览器之外。真正需要的是一些特殊的约定或配置,以将“inner_width”指定为一个符号概念,无论平移、缩放或调整大小如何,它都会根据需要更新。我建议制作一个 GitHub issue 来提议此功能。

与此同时,我认为任何解决方案都将涉及一些试验和错误,固定字体大小为“px”,并且如果可能的话最好限制 panning/zooming。