Рисование тепловой карты в BokeH отображает пустой график

Я пытаюсь нарисовать тепловую карту (спектрограмму) в боке, но когда отображается тепловая карта, она пуста.

Это код, в котором есть просто выборочные данные, но он будет расширен для получения большого набора данных через json.

from math import pi
import pandas as pd

from bokeh.io import show
from bokeh.models import LinearColorMapper, BasicTicker, PrintfTickFormatter, ColorBar
from bokeh.plotting import figure

# initialise data of lists. 
data = {'epoch':[63745131000000, 63745131000000, 63745131100000,63745131100000], 'energy':[1.06811, 1.22078, 1.59495, 1.82245],'value':[3981.9308143034305, 2868.5202872178324, 1330.887696894385, 745.6847248644897]} 

# Creates pandas DataFrame. 
df = pd.DataFrame(data) 

# print the data 
print(df)

# this is the colormap from the original NYTimes plot
colors = ['#00007F', '#0000ff', '#007FFF', '#00ffff', '#7FFF7F', '#ffff00', '#FF7F00', '#ff0000', '#7F0000']
mapper = LinearColorMapper(palette=colors, low=df.value.min(), high=df.value.max())

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

epochs = list(df.epoch.drop_duplicates())
print(epochs)
energies = list(df.energy.drop_duplicates())
print(energies)


p = figure(title="My Plot", 
           x_axis_location="below", 
           tools=TOOLS, toolbar_location='below',
           tooltips=[('epoch', '@epoch'), ('energy', '@energy'), ('value', '@value')])

p.xaxis.ticker = epochs
p.yaxis.ticker = energies

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.xaxis.major_label_orientation = pi / 3

p.rect(x="epoch", y="energy", width=1, height=1,
       source=df,
       fill_color={'field': 'value', 'transform': mapper},
       line_color=None)

color_bar = ColorBar(color_mapper=mapper, major_label_text_font_size="5pt",
                     ticker=BasicTicker(desired_num_ticks=len(colors)),
                     label_standoff=6, border_line_color=None, location=(0, 0))
p.add_layout(color_bar, 'right')

show(p)

Кадр, который выводится, выглядит правильно:

            epoch   energy        value
0  63745131000000  1.06811  3981.930814
1  63745131000000  1.22078  2868.520287
2  63745131100000  1.59495  1330.887697
3  63745131100000  1.82245   745.684725

и диапазоны для x и y также выглядят нормально:

[63745131000000, 63745131100000]
[1.06811, 1.22078, 1.59495, 1.82245]

Но на появившемся изображении нет точек: введите здесь описание изображения

Я должен упомянуть, если я просто изменю вторую эпоху на одну после, например)

'epoch':[63745131000000, 63745131000000, 63745131000001,63745131000001]

Тогда диаграмма, кажется, отображается правильно:

введите здесь описание изображения

Благодарен за любую помощь. Спасибо


person user1472672    schedule 27.09.2019    source источник
comment
Что происходит, когда вы меняете свои ограничения в картографе с одного ниже самого низкого значения на одно выше самого высокого значения вместо точных значений   -  person Marc    schedule 27.09.2019


Ответы (1)


Причина, по которой информация не отображается, заключается в том, что боке по краю, по-видимому, не считает, что ваша часть данных заслуживает цвета.

Что вы должны изменить, так это ограничения в вашем картографе:

mapper = LinearColorMapper(palette=colors, low=df.value.min()-1, high=df.value.max()+1) #  this will make sure your data is inside the mapping

Также ваша ширина определяется на рисунке как существо 1. Когда ваши эпохи отличаются на миллион, вы все равно почти ничего не увидите, когда рисуете это, поэтому измените

p.rect(x="epoch", y="energy", width=100000, height=1,  #  here width is set to an adequate level. 
       source=df,
       fill_color={'field': 'value', 'transform': mapper},
       line_color=None)
person Marc    schedule 27.09.2019
comment
Спасибо за ответ. Кажется, это работает. Что произойдет, если различия между эпохами не являются закономерными? - person user1472672; 30.09.2019
comment
Если они далеко друг от друга, они не будут касаться друг друга, в противном случае, я думаю, они будут перекрываться, и тот, что нанесен последним, будет в основном виден. Вы можете посмотреть на bokeh.pydata.org/en/latest/docs/ галерея/boxplot.html. Здесь значения отображаются не по их значению, а по имени, что позволяет полностью обойти проблему размера. - person Marc; 30.09.2019
comment
Хорошо спасибо. Последний вопрос, который у меня есть, заключается в том, как поместить заголовок цветной полосы по вертикали. Я видел еще один пост на SO, но он не работает. Создание новой фигуры. Конечно, это стандартная функция, позволяющая вертикально выровнять заголовок по цветовой полосе. Спасибо. - person user1472672; 30.09.2019
comment
Я предлагаю вам опубликовать это в отдельном вопросе;) В противном случае другие люди с такой же проблемой не смогут найти решение. - person Marc; 30.09.2019