使用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序列化
答案 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轴的实际比例实际上是多少。如果是日期时间,请注意底层单位为毫秒-自纪元,因此您需要用这种方式表示价格变动。有关在字典中使用浮点数作为键的标准警告也适用。