Bokeh 中带有浮点刻度值的自定义刻度标签

Custom tick labels in Bokeh with floating point tick values

我想在 Bokeh 中制作“Weibull paper”,这需要我在 y 轴上进行自定义变换并添加适当的 y 轴标签。

我正在按照这个 Whosebug 问题的已接受答案中的说明进行操作:How do I use custom labels for ticks in Bokeh?

以下是我的代码的相关五行:

yticks = np.array([1, 5, 10, 50, 99])
ytick_loc = np.log(np.log(1 / (1 - yticks/100)))
fig.yaxis.ticker = ytick_loc
tick_labels = [str(ytick) for ytick in yticks]
fig.yaxis.major_label_overrides = dict(zip(ytick_loc, tick_labels))

我的预期:绘图上有 5 个刻度,标签为“1”、“5”、“10”、“50”和“99”。

我得到的结果:绘图上有 5 个刻度,标签为“1”、“-2.97”、“10”、“-0.367”和“99”。因此,一些标签按照我的意愿进行了更改,而另一些则保留了它们的数字 y 值。

我猜这与浮点数或其他东西的公差有关,字典中的刻度与绘图上的刻度不完全匹配。如果它能解决这个问题,我会接受稍微四舍五入的值,但我不确定我能做到多大的容忍度并让它发挥作用。

有任何解决方法的建议吗?

我尝试了您的代码,但无法重现您的问题。我正在使用散景 1.0.4.

from bokeh.io import output_file, show
from bokeh.plotting import figure
import numpy as np

fig = figure()
fig.circle(x=[5,5,5,5,5], y=[-10,-5,0,1,2], size=10)

yticks = np.array([1, 5, 10, 50, 99])
ytick_loc = np.log(np.log(1 / (1 - yticks/100)))
fig.yaxis.ticker = ytick_loc
tick_labels = [str(ytick) for ytick in yticks]
fig.yaxis.major_label_overrides = dict(zip(ytick_loc, tick_labels))

output_file("test.html")

show(fig)

正如我在对其他答案的评论中提到的,问题中的行为只发生在我的工作计算机上,而不是在我的家用计算机上。还没搞清楚是浏览器的问题,还是python版本的问题,还是其他一些库的问题,反正不是Bokeh版本的

以下代码没有问题:

from bokeh.io import output_file, show
from bokeh.plotting import figure
import numpy as np

fig = figure()
fig.circle(x=[5,5,5,5,5], y=[-10,-5,0,1,2], size=10)

yticks = np.array([1, 5, 10, 50, 99])
ytick_loc = np.log(np.log(1 / (1 - yticks/100)))
ytick_loc = np.around(ytick_loc, 15)
fig.yaxis.ticker = ytick_loc
tick_labels = [str(ytick) for ytick in yticks]
fig.yaxis.major_label_overrides = dict(zip(ytick_loc, tick_labels))

output_file("test.html")

show(fig)

我添加的具体行是:

ytick_loc = np.around(ytick_loc, 15)

我会注意到,四舍五入到 16 位数字足以修复两个错误中的一个,但需要四舍五入到 15 位数字才能修复两个。我不知道这是一个多么通用的解决方案,即它是否适用于任意浮点数,但它解决了我当前的问题。