如何使用Bokeh正确创建热力图

8

我正在尝试使用Bokeh而不是matplotlib来复制这个问题中显示的HeatMap。然而,我还没有做到完全正确。现有的示例没有帮助我理解我做错了什么。这是我的一次尝试。

from bokeh.io import output_notebook; output_notebook()
from bokeh.charts import HeatMap, show
from bokeh.palettes import RdYlGn6
import pandas as pd
import numpy as np

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('PTS', inplace=True)

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

data = {
  'players': list(nba.index) * len(nba.columns),
  'metric':  list(nba.columns) * len(nba.index),
  'score':   score,
}

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

提供:

在此输入图像描述

请注意,尽管标题相似,但这个并不回答我的问题。这不是同样的错误,并且我正在使用Bokeh 0.12.3。


数据没有正确对齐。您重复了playersmetric列表,其中一个需要逐个元素重复。 - p-robot
2个回答

14

如果您仍然想使用Bokeh创建热力图:charts模块已经在较新的版本中被删除。换句话说,这个命令不能与更新的Bokeh版本一起使用:

from bokeh.charts import HeatMap

由于它给出了错误:

ImportError: cannot import name 'charts'

图表已经转移到bkcharts包中,该包随后被停用(更多参考请见此答案)。Holoviews仍对Bokeh提供部分支持,但语法不同。

在Bokeh中创建热图的解决方案是使用p.rect(),如此链接关于unemployment.py所述,将得到类似以下结果:

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

生成的结果如下所示:

在这里输入图片描述


请注意,自版本1.4.0以来,values= kwarg不再存在。在更新的“失业率”示例中,改用LinearColorMapper - mbugert

3

将数据的生成方式更改为逐元素重复,这样metric就应该是正确的:

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

所以适用于我的代码如下:
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)

enter image description here


1
啊,当然!谢谢!:-) 顺便说一下,list(nba.index) 不是必要的,至少在这里不需要。 - Niklas R

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