Тепловая карта не показывает - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь построить простую тепловую карту из кадра данных, который выглядит следующим образом:

   row column content amount
0    x      a      c1      1
2    x      b      c3      3
4    x      c      c2      1
6    y      a      c1      1
8    y      b      c3      3
10   y      c      c2      1
12   z      a      c1      1
14   z      b      c3      3
16   z      c      c2      1

row и column указывают положение ячейки, ее цвет должен быть выбран на основе content, и я хочу, чтобы всплывающие подсказки отображали content и amount.

В настоящее время я пробую это так (используя bokeh 1.2.0):

import pandas as pd

from bokeh.io import show
from bokeh.models import CategoricalColorMapper, LinearColorMapper, BasicTicker, PrintfTickFormatter, ColorBar, ColumnDataSource
from bokeh.plotting import figure
from bokeh.palettes import all_palettes
from bokeh.transform import transform

df = pd.DataFrame({
    'row': list('xxxxxxyyyyyyzzzzzz'),
    'column': list('aabbccaabbccaabbcc'),
    'content': ['c1', 'c2', 'c3', 'c1', 'c2', 'c3'] * 3,
    'amount': list('123212123212123212')})

df = df.drop_duplicates(subset=['row', 'column'])

source = ColumnDataSource(df)

rows = df['row'].unique()
columns = df['column'].unique()
content = df['content'].unique()

colors = all_palettes['Viridis'][max(len(content), 3)]
mapper = CategoricalColorMapper(palette=colors, factors=content)

TOOLS = "hover,save,pan,box_zoom,reset,wheel_zoom"

p = figure(title="My great heatmap",
           x_range=columns, y_range=rows,
           x_axis_location="above", plot_width=600, plot_height=400,
           tools=TOOLS, toolbar_location='below',
           tooltips=[('cell content', '@content'), ('amount', '@amount')])

p.grid.grid_line_color = None
p.axis.axis_line_color = None
p.axis.major_tick_line_color = None
p.axis.major_label_text_font_size = "5pt"
p.axis.major_label_standoff = 0

p.rect(x="row", y="column", width=1, height=1,
       source=source,
       fill_color=transform('content', mapper))

# color_bar = ColorBar(color_mapper=mapper, major_label_text_font_size="5pt",
#                      location=(0, 0))
# p.add_layout(color_bar, 'right')

show(p)

Однако есть две проблемы:

1) При выполнении я получаю пустую тепловую карту: enter image description here

Есть идеи почему?

2) Когда я закомментирую часть color_bar = ..., я получаю сообщение об ошибке:

ValueError: ожидал экземпляр типа ContinuousColorMapper, получил CategoryorColorMapper (id = '3820', ...) типа КатегориальныйColorMapper

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Ваши x и y меняются координаты, должно быть:

p.rect(x="column", y="row", ...)

Что касается другого сообщения, оно самоочевидно: Начиная с Bokeh 1.2, ColorBar может быть сконфигурировано только с использованием непрерывных цветовых карт (например, LinearColorMapper). Вы можете либо:

  • самостоятельно вычисляет цвета в коде Python и включает столбец цветов в source или
  • пересчитать ваш график, чтобы использовать LinearColorMapper (то есть карту content, соответствующую некоторому числовому масштабу)
0 голосов
/ 25 июня 2019

Для вашего colorBar решение здесь, я тихо еще не понял, что случилось с вашим источником, в другой раз буду копать немного глубже.ColorBar ожидал непрерывного картографа, который вы дали ему категоричный.

from bokeh.models import (CategoricalColorMapper, LinearColorMapper, 
BasicTicker, PrintfTickFormatter, ColorBar, ColumnDataSource, 
LinearColorMapper)


factors =df['content'].unique().tolist()
colors = all_palettes['Viridis'][max(len(factors), 3)]
mapper = LinearColorMapper(palette=colors)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...