1. ホーム
  2. python

[解決済み】Bokehでヒートマップを正しく作成する方法

2022-01-26 16:57:48

質問

で示したHeatMapを再現しようとしています。 この質問 matplotlibの代わりにBokehを使用しています。しかし、なかなかうまくいきません。既存の例は、私が間違ってやっていることを理解するのに役立ちませんでした。私の謙虚な試み

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を使用しています。

解決方法を教えてください。

データの世代を変更する 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)