Рисование тепловой карты в BokeH отображает пустой график - PullRequest
0 голосов
/ 27 сентября 2019

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

Это код, который имеет некоторые простые данные образца, но он будет расширен для получениябольшой набор данных через 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]

Но на отображаемом изображении нет точек: enter image description here

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

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

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

enter image description here

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

1 Ответ

2 голосов
/ 27 сентября 2019

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

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

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...