How to properly create a HeatMap with Bokeh

旧时模样 提交于 2019-11-29 15:25:37

Change the generation of the data metric to repeat element-wise and it should be correct:

'metric': [item for item in list(nba.columns) for i in range(len(nba.index))],

So the code that works for me is the following:

from bokeh.charts import HeatMap, show, output_file
import pandas as pd, numpy as np
from urllib2 import urlopen

nba = pd.read_csv(urlopen("http://datasets.flowingdata.com/ppg2008.csv"), index_col=0)

# Normalize the data columns and sort.
nba = (nba - nba.mean()) / (nba.max() - nba.min())
nba.sort_values(by = 'PTS', inplace=True)

score = []
for x in nba.apply(tuple):
  score.extend(x)

data = {
  'players': list(nba.index) * len(nba.columns),
  'metric':  [item for item in list(nba.columns) for i in range(len(nba.index))],
  'score':   score,
}

output_file('test.html')
hm = HeatMap(data, x='metric', y='players',values='score', title='Fruits', stat=None)
show(hm)

In case you still want to create a heatmap using Bokeh: the charts module was removed in more recent versions. In other words, this command will not work with newer versions of Bokeh:

from bokeh.charts import HeatMap

Since it gives the error:

ImportError: cannot import name 'charts'

Charts was moved to bkcharts package, which was than discontinued (further reference in in this answer). Holoviews still has some support for Bokeh, but has some different syntax.

A solution for creating Heatmaps in Bokeh is using p.rect() as instructed in this link about unemployment.py, which results in something like this:

p = figure()
hm = p.rect(data, x='metric', y='players',values='score', title='Fruits', stat=None)

Which yields a results that looks like this:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!