Python Bokeh: установите цвет линии на основе столбца в источнике данных столбца

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

x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y0 = [i**2 for i in x]
y1 = [10**i for i in x]
y2 = [10**(i**2) for i in x]
df = pandas.DataFrame(data=[x,y0,y1,y2]).T
df.columns = ['x','y0','y1','y2']

df2 = pd.concat([df.iloc[0:,1],df.iloc[0:,2],df.iloc[0:,3]], axis=0, keys = ['a','b','c']).reset_index()
df2.columns = ['grp','x','y']

df2

+----+-----+---+----------+
|    | grp | x |    y     |
+----+-----+---+----------+
|  0 | a   | 0 | 0.01     |
|  1 | a   | 1 | 0.25     |
|  2 | a   | 2 | 1.00     |
|  3 | a   | 3 | 2.25     |
|  4 | a   | 4 | 4.00     |
|  5 | a   | 5 | 6.25     |
|  6 | a   | 6 | 9.00     |
|  7 | b   | 0 | 1.26     |
|  8 | b   | 1 | 3.16     |
|  9 | b   | 2 | 10.00    |
| 10 | b   | 3 | 31.62    |
| 11 | b   | 4 | 100.00   |
| 12 | b   | 5 | 316.23   |
| 13 | b   | 6 | 1,000.00 |
+----+-----+---+----------+

cd_df2 = ColumnDataSource(df2)

То есть у меня будут «группы», в которых пары x, y для каждой группы перечислены в нескольких строках.

Следующее выводит все 3 строки, но все они отображаются серым цветом. Установка color = 'grp' не указывает цвет для каждого значения в поле grp в источнике данных столбца.

f = figure(tools="save",y_axis_type="log", y_range=[0.001, 10**11], 
       title="log axis example",x_axis_label='sections', y_axis_label=
       'particles')

f.line('x','y', line_color = 'grp', source = cd_df2)

Как я могу добиться этого в API bokeh.plotting или bokeh.models (хочется избежать диаграмм высокого уровня, чтобы лучше понять библиотеку)? Я открыт для других предложений, которые избегают явного вызова f.line() один раз для каждой строки и индивидуально устанавливают цвет (у меня может быть 10+ строк, и это будет утомительно).


person AllenQ    schedule 18.09.2015    source источник


Ответы (1)


Вы можете повторно использовать принцип, описанный в этом примере. Он основан на «патчах», но то же самое для «линии» (см. http://docs.bokeh.org/en/latest/docs/reference/plotting.html):

p = figure()    
p.patches([x2 for a in areas], list(areas.values()), color=colors, alpha=0.8, line_color=None)
person PiWi    schedule 18.11.2015