我想在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值。
我猜想这与浮点数的公差有关,或者与字典中的刻度不完全匹配图上的刻度有关。如果可以解决此问题,我会略微四舍五入这些值,但是我不确定我可以做到什么并使它起作用。
有任何解决方法的建议吗?
答案 0 :(得分:1)
我尝试了您的代码,但无法重现您的问题。我正在使用Bokeh 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)
答案 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位才能修复两个刻度。我不知道这有多通用的解决方案,也就是说,它是否适用于任意浮点数,但是它解决了我当前的问题。