散景中具有浮点刻度值的自定义刻度标签

时间:2019-01-22 14:16:56

标签: python floating-point precision bokeh weibull

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

我正在按照对此Stackoverflow问题的可接受答案中的说明进行操作: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值。

Picture of Bokeh plot showing weird y-axis labelling

我猜想这与浮点数的公差有关,或者与字典中的刻度不完全匹配图上的刻度有关。如果可以解决此问题,我会略微四舍五入这些值,但是我不确定我可以做到什么并使它起作用。

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

2 个答案:

答案 0 :(得分:1)

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

enter image description here

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)

答案 1 :(得分:0)

正如我在对另一个答案的评论中提到的那样,问题中的行为仅发生在我的工作计算机上,而不发生在我的家用计算机上。我还不确定是浏览器,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位才能修复两个刻度。我不知道这有多通用的解决方案,也就是说,它是否适用于任意浮点数,但是它解决了我当前的问题。