我有一个像这样的数据框(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)
但是,这会产生一个空白画布。我尝试使用.groupby
,pd.pivot_table
和pd.crosstab
订购我的数据,但到目前为止我都失败了。我是Bokeh的新手,所以,有人有任何建议吗?
答案 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)