【发布时间】:2018-02-08 17:09:20
【问题描述】:
我无法理解日期时间在 Bokeh 中的工作原理。
我的代码在 x 轴上输出毫秒数,如果轴类型是“日期时间”,这似乎是默认值,但我希望每隔 5 年将其分隔一次。
如何在 Bokeh 中实现这一点?日期在 1950 年之前,所以我不能使用时间戳。当我排除日期时间轴类型时,它会将每个值显示为 x 轴上的刻度。当我尝试将输入的数据更改为日期时间对象时,Bokeh 拒绝它。
我已阅读有关该主题的其他帖子,以及 Bokeh 关于 DatetimeTickFormatter,这似乎也不适合我。
Bokeh FixedTicker with Custom Datetime/Timestamp values
我所有的情节代码如下:
r = requests.get('https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json')
data = json.loads(r.text)
chart_data = {
'date': [a[0] for a in data['data']], #this is the problem data
'gdp': [a[1] for a in data['data']],
}
source = ColumnDataSource(chart_data)
hover = HoverTool(
tooltips=[
('GDP', '@gdp{$0,0.00}'),
('Date', '@date{%Y - %B}'),
],
formatters={
'date' : 'datetime',
}
)
bar = figure(x_range=chart_data['date'],
x_axis_type='datetime',
plot_height=750,
plot_width=1000,
tools='wheel_zoom, reset, save',
title=data['source_name'])
bar.vbar(x='date', top='gdp', width=0.9, source=source)
bar.add_tools(hover)
#visual settings
bar.xaxis.formatter = DatetimeTickFormatter(years = ['%Y'])
bar.xaxis.major_label_orientation = 'vertical'
bar.xaxis.minor_tick_line_color = None
bar.xgrid.grid_line_color = None
bar.yaxis.formatter = NumeralTickFormatter(format='$0,0.00')
bar.ygrid.grid_line_color = None
show(bar)
感谢您的帮助,这让我发疯了!
【问题讨论】:
-
chart_data['date']到底是什么? -
感谢您的帮助!如果您查看链接中的 json,日期格式为 '%Y-%m-%d'。例如:“1947-01-01”。 raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/…
-
传递一系列字符串会导致分类范围,这就是日期时间轴不起作用的原因,以及显示所有值的原因(分类轴显示所有因素)。我建议转换为 Bokeh 将处理的真实日期时间对象。然后,如果您不想要可以使用的标准日期时间代码,例如
YearsTicker -
所以我转换为日期时间对象,但 Bokeh 给了我一个 ValueError。 "ValueError("无法识别的范围输入:'%s'" % str(range_input))"。我更改了:'date': [datetime.strptime(a[0], '%Y-%m-%d') for a in data['data']] 这是不正确的吗?
-
不要再设置
x_range。对于真正的日期时间对象,默认的DataRange1d就是您想要的。