Python / Bokeh - Colorbar с форматированием даты и времени - PullRequest
0 голосов
/ 24 апреля 2018

Может, кто-нибудь подскажет, как отформатировать тикер на цветовой панели bokeh для даты и времени?

Пример ниже окрашивает диаграмму рассеяния с указателем даты и времени. Мне бы хотелось, чтобы цветовая шкала была отформатирована так, чтобы показывать несколько тиков с Годом / Месяцем, подобно тому, как работает figure (x_axis_type = 'datetime').

См. Сюжет . В настоящее время показывает время в мс. Скорее всего, это связано с установкой правильных значений для аргументов low и high в LinearColorMapper (), а затем с получением правильного формата из DatetimeTickFormatter ()

Игрушка Пример:

import pandas as pd
import numpy as np
import bokeh.plotting as bk_plt
import bokeh.palettes as bk_pal
import bokeh.models as bk_mod

bk_plt.output_notebook()

Data = pd.DataFrame(index = pd.date_range(start = '2012-04-01', end = '2013-08-16', freq = 'H'))
Data['X'] = np.random.rand(len(Data.index))
Data['Y'] = np.random.rand(len(Data.index))

Data['Time'] = Data.index.to_julian_date()
CMin = Data['Time'].min()
CRange = Data['Time'].max() - Data['Time'].min()
Cols = (Data['Time'] - CMin) * 255 // CRange
Data['Colors'] = np.array(bk_pal.Plasma256)[Cols.astype(int).tolist()]

color_mapper = bk_mod.LinearColorMapper(palette='Plasma256', low = int(Data.index[0].strftime("%s")) * 1000, high = int(Data.index[-1].strftime("%s")) * 1000)

color_bar = bk_mod.ColorBar(color_mapper=color_mapper, ticker=bk_mod.BasicTicker(), formatter = bk_mod.DatetimeTickFormatter(), label_standoff=12, border_line_color=None, location=(0,0))


p = bk_plt.figure()
p.circle(x = Data.X, y = Data.Y, size = 5, color = Data.Colors, alpha = 0.5)
p.add_layout(color_bar, 'right')
bk_plt.show(p)

1 Ответ

0 голосов
/ 24 апреля 2018

Как указало bigreddot, даты Bokeh представлены с плавающей точкой в ​​мс с начала эпохи. LinearColorMapper нуждается в минимуме и максимуме, определяемом следующим образом:

color_mapper = bk_mod.LinearColorMapper(
    palette='Plasma256', 
    low = int(Data.index[0].strftime("%s")) * 1000, 
    high = int(Data.index[-1].strftime("%s")) * 1000
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...