python - 在点的确切位置显示 Bokeh 日期时间轴的标签
问题描述
我正在使用 Bokeh 的日期时间轴。在 Bokeh 数据源中,我的 x 是 numpy 日期时间格式,其他的是 y 数字。我正在寻找一种在该点正下方显示 x datetimx 轴标签的方法。我希望 Bokeh 显示我通过数据源提供的确切日期时间,而不是一些近似值!例如,我提供 5:15:00,它在相关点之前的某处显示 5:00:00。我计划每 1 小时将数据流式传输到图表,并且我想每次显示 5 个点。因此,我需要 5 个日期时间标签。我怎样才能做到这一点?我试过p.yaxis[0].ticker.desired_num_ticks = 5
但没有帮助。Bokeh 仍然可以显示任意数量的刻度!这是我的代码和结果:
import numpy as np
from bokeh.models.sources import ColumnDataSource
from bokeh.plotting import figure
from bokeh.io import show
from bokeh.palettes import Category10
p = figure(x_axis_type="datetime", plot_width=800, plot_height=500)
data = {'x':
[np.datetime64('2019-01-26T03:15:10'),
np.datetime64('2019-01-26T04:15:10'),
np.datetime64('2019-01-26T05:15:10'),
np.datetime64('2019-01-26T06:15:10'),
np.datetime64('2019-01-26T07:15:10')],
'A': [10,25,15,55,40],
'B': [60,50,80,65,120],}
source = ColumnDataSource(data=data)
cl = Category10[3][1:]
r11 = p.line(source=source, x='x', y='A', color=cl[0], line_width=3)
r12 = p.line(source=source, x='x', y='B', color=cl[1], line_width=3)
p.xaxis.formatter=DatetimeTickFormatter(
seconds=["%H:%M:%S"],
minsec=["%H:%M:%S"],
minutes=["%H:%M:%S"],
hourmin=["%H:%M:%S"],
hours=["%H:%M:%S"],
days=["%H:%M:%S"],
months=["%H:%M:%S"],
years=["%H:%M:%S"],
)
p.y_range.start = -100
p.x_range.range_padding = 0.1
p.yaxis[0].ticker.desired_num_ticks = 5
p.xaxis.major_label_orientation = math.pi/2
show(p)
结果如下:
解决方案
如文档中所述,num_desired_ticks
这只是一个建议。如果您希望在特定位置的刻度不改变,那么您可以使用 a FixedTicker
,可以通过普通列表设置方便:
p.xaxis.ticker = [2, 3.5, 4]
对于日期时间,您可以将值作为自纪元以来的毫秒数传递。
如果您想要固定数量的刻度,但位置可能会改变(即因为范围可能会改变),那么没有内置的东西可以做到这一点。您可以制作自定义代码扩展。
推荐阅读
- c - 从未知长度的文件中读取字符串的函数
- google-cloud-platform - 有没有办法提取 Google Cloud Function 执行的成本?
- c# - System.Runtime.InteropServices.COMException (0x8001010A):消息过滤器指示应用程序正忙
- html - 引导程序中具有响应式设计的小输入字段(-vue)
- javascript - 无法读取 null 的属性“appendChild”-Tiny Slider React
- flutter - 飞镖中的多级地图或地图列表?
- java - 从 Active Directory 检索密码到期警告
- ansible - 访问 json_query 中包含特殊字符的字段
- celery - 芹菜:无法通过烧瓶调用任务,在烧瓶外工作
- umbraco - Ucommerce 解析 niceurl 或设置上下文