如何使用 Bokeh 正确创建热图
How to properly create a HeatMap with Bokeh
我正在尝试使用 Bokeh 而不是 matplotlib 来复制 this question 中显示的热图。虽然我不能完全正确。现有的例子并没有帮助我理解我做错了什么。我的卑微尝试
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)
给予
请注意,尽管标题相似,this 并未回答我的问题。这不是同一个错误,我使用的是 Bokeh 0.12.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)
如果您仍想使用 Bokeh 创建热图:图表模块已在最新版本中删除。换句话说,此命令不适用于较新版本的 Bokeh:
from bokeh.charts import HeatMap
由于报错:
ImportError: cannot import name 'charts'
Charts 已移至 bkcharts 包,然后停止使用( 中有进一步的参考)。 Holoviews 仍然对 Bokeh 有一些支持,但有一些不同的语法。
在 Bokeh 中创建热图的解决方案是按照 this link about unemployment.py 中的说明使用 p.rect(),结果如下:
p = figure()
hm = p.rect(data, x='metric', y='players',values='score', title='Fruits', stat=None)
产生的结果如下所示:
我正在尝试使用 Bokeh 而不是 matplotlib 来复制 this question 中显示的热图。虽然我不能完全正确。现有的例子并没有帮助我理解我做错了什么。我的卑微尝试
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)
给予
请注意,尽管标题相似,this 并未回答我的问题。这不是同一个错误,我使用的是 Bokeh 0.12.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)
如果您仍想使用 Bokeh 创建热图:图表模块已在最新版本中删除。换句话说,此命令不适用于较新版本的 Bokeh:
from bokeh.charts import HeatMap
由于报错:
ImportError: cannot import name 'charts'
Charts 已移至 bkcharts 包,然后停止使用(
在 Bokeh 中创建热图的解决方案是按照 this link about unemployment.py 中的说明使用 p.rect(),结果如下:
p = figure()
hm = p.rect(data, x='metric', y='players',values='score', title='Fruits', stat=None)
产生的结果如下所示: