应用FuncTickFormatter时在xaxis直方图Bokeh / Python中变得未定义

时间:2019-08-15 13:36:11

标签: python bokeh

使用Python中的FuncTickFormatter在散景xaxis(直方图)上获取“未定义”

我尝试将日期格式化为列表,然后通过python中的FuncTickFormatter运行它;我同样尝试过将日期设置为索引,但仍然遇到相同的问题。我是使用bokeh的新手。非常感谢您的帮助。

arr_df.head()

    dateL          count  left  right  f_count    f_interval
0   2022-12-29       1    1424  1458     1      1424 to 1458
1   2023-02-02       3    1458  1492     3      1458 to 1492 
2   2023-03-08       3    1492  1527     3      1492 to 1527
dicaxis1 = arr_df['dateL'].to_dict()

p = figure(plot_width = 500, plot_height = 500)

select_axis_key = range(0, len(arr_df), 1)
select_axis = {k:v for (k,v) in dicaxis1.items() if k in select_axis_key}

p.xaxis.ticker = FixedTicker(ticks=select_axis_key)
p.xaxis.formatter = FuncTickFormatter(code="""var labels = {}; return labels[tick];""" % select_axis)

r = p.quad(bottom=0, top='count', left='datel', right='dater', source=arr_src,
       fill_color='red', line_color='black')

styled_p = style(p)

hover = HoverTool(tooltips = [('Duration', '@f_interval'),
                              ('Numb. of Phases', '@f_count')])
styled_p.add_tools(hover)

show(styled_p)

TypeError:“范围”类型的对象不可JSON序列化

enter image description here

1 个答案:

答案 0 :(得分:0)

此错误的直接原因是labels[tick]不存在。并没有特别的理由。您已经保留了Bokeh的默认自动刻度选项,并且没有理由让Bokeh选择与您在label_dict中输入的任何键相匹配的刻度位置。您需要使用FixedTicker控制刻度位置,以确保匹配。但是实际上实际上比您制作的要简单,您可以设置所需的刻度,也可以更简单地设置其格式:

p.xaxis.ticker = ticks  # specify fixed tick locations
p.xaxis.major_label_overrides = label_dict  # as well as their format

label_dict的键应与您设置的ticks相同。从您发布的不完整代码尚不清楚,x轴的实际比例实际上是多少。如果是日期时间,请注意底层单位为毫秒-自纪元,因此您需要用这种方式表示价格变动。有关在字典中使用浮点数作为键的标准警告也适用。