如何命令我的数据在Bokeh中制作HeatMap?

时间:2017-02-23 16:12:09

标签: python pandas heatmap bokeh

我有一个像这样的数据框(mD):

Pr      Dt           Cd      Cn      Rn
GT      2017-01-12   60      1       'ZP0'
GT      2017-01-12   60      6       'ZP5'
GT      2017-01-12   61      0       'ZP0'
GT      2017-01-12   61      7       'ZP6'
GT      2017-01-12   65      7       'ZP4'
GT      2017-01-10   63      1       'ZP4'
GT      2017-01-10   65      2       'ZP4'
GT      2017-01-10   68      3       'ZP2'
GT      2017-01-09   62      8       'ZP1'
GT      2017-01-12   62      1       'ZP1'
GT      2017-01-11   62      2       'ZP0'
GT      2017-01-11   60      2       'ZP0'
GT      2017-01-10   66      4       'ZP5'
GT      2017-01-10   60      1       'ZP6'
GT      2017-01-09   68      1       'ZP2'
GT      2017-01-09   65      1       'ZP0'
GT      2017-01-09   62      1       'ZP3'
GT      2017-01-09   62      1       'ZP3'
BW      2017-01-11   61      0       'ZP0'
BW      2017-01-10   61      1       'ZP1'
BW      2017-01-10   61      6       'ZP0'
BW      2017-01-11   61      0       'ZP5'
BW      2017-01-11   62      1       'ZP5'
BW      2017-01-12   62      6       'ZP7'
BW      2017-01-11   60      5       'ZP0'
BW      2017-01-09   66      4       'ZP2'

我想在Bokeh中创建一个HeatMap,其中x = Cd(从60到70),y = Dt(具有日期时间格式)和values = Cn。换句话说,我想要每个产品(Pr)的热图,其中的代码(Cd)与日期(Dt)相对应,颜色必须代表总和对每个日期和代码计算(Cn)。

我的第一次尝试是这样的(当然导入库之后):

mHt = HeatMap(mD, x = 'Cd', y = 'Dt', values = 'Cn')
output_file("Heatmap.html", title="Heatmap")
show(mHt) 

但是,这会产生一个空白画布。我尝试使用.groupbypd.pivot_tablepd.crosstab订购我的数据,但到目前为止我都失败了。我是Bokeh的新手,所以,有人有任何建议吗?

1 个答案:

答案 0 :(得分:2)

编辑:不再维护散景图表仓库,因此如果您想使用最新版本的散景图,则应使用Holoviews,或编写自己的代码来制作热图。

尝试以下代码,似乎有用。
注意: 如果您想为每种颜色添加单独的热图,只需过滤df并创建单独的图。 或者创建一个小部件,让您选择要显示的数据集。

import pandas as pd
from bokeh.charts import HeatMap, bins
from bokeh.plotting import figure, output_file, show,ColumnDataSource
from bokeh.models import DatetimeTickFormatter

Dt = ['2017-01-12','2017-01-12','2017-01-12','2017-01-12','2017-01-12',
      '2017-01-10','2017-01-10','2017-01-10','2017-01-09','2017-01-12',
      '2017-01-11','2017-01-11','2017-01-10','2017-01-10','2017-01-09',
      '2017-01-09','2017-01-09','2017-01-09','2017-01-11','2017-01-10',
      '2017-01-10','2017-01-11','2017-01-11','2017-01-12','2017-01-11',
      '2017-01-09']
Pr = ['GT','GT','GT','GT','GT','GT','GT','GT','GT','GT','GT','GT','GT','GT',
      'GT','GT','GT','GT','BW','BW','BW','BW','BW','BW', 'BW', 'BW']
Cd = [60,60,61,61,65,63,65,68,62,62,62,60,66,60,68,65,62,62,61,61,61,61,62,62,60,66]
Cn = [1,6,0,7,7,1,2,3,8,1,2,2,4,1,1,1,1,1,0,1,6,0,1,6,5,4]

df = pd.DataFrame({'Pr':Pr,'Dt':Dt,'Cd':Cd,'Cn':Cn})
datadict = df.to_dict(orient='list')
source = ColumnDataSource(datadict)

h1 = HeatMap(source.data, x=bins('Cd'), y='Dt', values='Cn')
show(h1)

enter image description here