Боке - применить цветовую карту к набору линий - PullRequest
0 голосов
/ 05 мая 2018

У меня есть фрагмент кода, который использует matplotlib для построения набора линий и применяет цвета к этим линиям, используя цветовую карту. Выдержка из кода и результат следующие:

cm = plt.cm.get_cmap('jet')
step = 15
xi = np.linspace(data[data.columns[0]].min(), data[data.columns[0]].max(), 2)
colors_l = np.linspace(0.1, 1, len(state_means[::step]))
for i, beta in enumerate(state_means[::step]):
    plt.plot(xi, beta[0] * xi + beta[1], alpha=.2, lw=1, c=cm(colors_l[i]))

Output using matplotlib

Соответствующая часть кода здесь

c=cm(colors_l[i])

, который находится внутри функции plt.plot (). Здесь можно индексировать карту цветов с помощью параметра (в данном случае i).

Однако, если я пытаюсь сделать что-то подобное, используя bokeh, с его глифом ColorMapper и line (), я сталкиваюсь с ошибкой. Соответствующие строки кода и выходные данные

call_color_mapper = LinearColorMapper(palette="Viridis256", low=min(call_strike_vals), high=max(call_strike_vals))
call_lines=dict()
call_chain_plot = figure(y_axis_label='Call OI', x_axis_label='Dates', x_axis_type = 'datetime')
for strike in call_strikes:
    call_lines[strike] = call_chain_plot.line('TIMESTAMP', strike, line_color=call_color_mapper(int(strike[2:])), source=callSource)

TypeError: 'LinearColorMapper' object is not callable

Есть ли способ раскрасить набор линейных глифов с помощью цветовой карты в боке?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Хотя решение @ bigreddot предоставляет отличную альтернативу глифу line () для построения набора линий с использованием linear_cmap (), оно не обеспечивает способ захвата дескрипторов для отдельного человека. линии, если для дальнейшей обработки понадобятся маркеры (например, построение вторичной оси Y для некоторых из них). По этой причине я собираю маркеры для каждой строки в словаре в моем OP.

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

from bokeh.palettes import viridis #here viridis is a function that takes\
#parameter n and provides a palette with n equally(almost) spaced colors.

call_colors = viridis(len(call_strikes))
color_key_value_pairs = list(zip(call_strikes, call_colors))
color_dict = dict(color_key_value_pairs)

Теперь словарь color_dict можно использовать для доступа к цветам на основе значений в словаре. Итак, я запускаю код из ОП следующим образом:

call_lines=dict()
for index, strike in enumerate(call_strikes):
call_lines[strike] = call_chain_plot.line('xs', strike, color=color_dict[strike], source=callSource)

Полагаю, именно это имел в виду @ bigreddot , когда писал: «Если вам действительно нужны цвета в Python, вам придется отображать их вручную, есть много способов сделать это».

0 голосов
/ 05 мая 2018

LinearColorMapper не вычисляет цвета в Python. Скорее, LinearColorMapper представляет цветовое отображение, которое происходит в браузере, в JavaScript . Если вам действительно нужны цвета в Python, вам придется отображать их вручную, есть много способов сделать это.

Но вы, вероятно, этого не делаете, поэтому лучший способ сделать это в Bokeh - это использовать multi_line вместо повторных вызовов line. Это частично из соображений производительности, Bokeh оптимизирован для выполнения лучше, чем «векторизованные» операции. Кроме того, он позволяет использовать вспомогательную функцию linear_cmap для создания цветового сопоставления для любого столбца данных, который вам нравится. Вот полный пример:

from bokeh.io import output_file, show
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.transform import linear_cmap

output_file("cmap.html")

p = figure()

source = ColumnDataSource(data=dict(
    xs=[[0,1] for i in range(256)],     # x coords for each line (list of lists)
    ys=[[i, i+10] for i in range(256)], # y coords for each line (list of lists)
    foo=list(range(256))                # data to use for colormapping
))

p.multi_line('xs', 'ys', source=source,
             color=linear_cmap('foo', "Viridis256", 0, 255))

show(p)

enter image description here

...