无法在 Bokeh 中使用日期时间 x 轴绘制热力图

5
我将尝试绘制以下简单的热力图:
data = {
    'value': [1, 2, 3, 4, 5, 6],
    'x': [datetime(2016, 10, 25, 0, 0),
          datetime(2016, 10, 25, 8, 0),
          datetime(2016, 10, 25, 16, 0),
          datetime(2016, 10, 25, 0, 0),
          datetime(2016, 10, 25, 8, 0),
          datetime(2016, 10, 25, 16, 0)],
    'y': ['param1', 'param1', 'param1', 'param2', 'param2', 'param2']
}
hm = HeatMap(data, x='x', y='y', values='value', stat=None)
output_file('heatmap.html')
show(hm)

很遗憾,它无法正确渲染:

enter image description here

我尝试设置x_range,但似乎没有任何效果。

我使用以下代码成功地解决了这个问题:

d1 = data['x'][0]
d2 = data['x'][-1]

p = figure(
    x_axis_type="datetime", x_range=(d1, d2), y_range=data['y'],
    tools='xpan, xwheel_zoom, reset, save, resize,'
)

p.rect(
    source=ColumnDataSource(data), x='x', y='y', width=12000000, height=1,
)

但是,一旦我尝试使用缩放工具,就会在控制台中看到以下错误:

Uncaught Error: Number property 'start' given invalid value: 
Uncaught TypeError: Cannot read property 'indexOf' of null

我使用的是 Bokeh 0.12.3 版本。


1
没有一个完整的示例来“修复”,很难提供具体的建议。重复下方的评论:分类数据有一个全新的用户指南部分,包括热图,或混合分类与日期时间轴在这里:https://bokeh.pydata.org/en/latest/docs/user_guide/categorical.html值得注意的是,`HeatMap`和所有的`bokeh.charts`都已经过时并长期移除,现在不应该使用。 - bigreddot
1
Bokeh非常适合制作热力图,只是不要使用旧的bokeh.charts。请参见http://bokeh.pydata.org/en/latest/docs/user_guide/categorical.html#heat-maps。 - bigreddot
@bigreddot 好的,明白了,感谢澄清。 - JohnE
1个回答

2

bokeh.charts,包括HeatMap已于2017年被弃用和移除。您应该使用稳定且受支持的bokeh.plotting API。针对您上述的数据,以下是一个完整的示例:

from datetime import datetime

from bokeh.plotting import figure, show
from bokeh.transform import linear_cmap

data = {
    'value': [1, 2, 3, 4, 5, 6],
    'x': [datetime(2016, 10, 25, 0, 0),
          datetime(2016, 10, 25, 8, 0),
          datetime(2016, 10, 25, 16, 0),
          datetime(2016, 10, 25, 0, 0),
          datetime(2016, 10, 25, 8, 0),
          datetime(2016, 10, 25, 16, 0)],
    'y': ['param1', 'param1', 'param1', 'param2', 'param2', 'param2']
}

p = figure(x_axis_type='datetime', y_range=('param1', 'param2'))

EIGHT_HOURS = 8*60*60*1000

p.rect(x='x', y='y', width=EIGHT_HOURS, height=1, line_color="white",
       fill_color=linear_cmap('value', 'Spectral6', 1, 6), source=data)

show(p)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接