Перемещение составной полосы, которая работала в Bokeh 0.9, на Bokeh 0.11

Я обновляю все свои системы с Bokeh 0.9 до Bokeh 0.11, и у меня есть одна диаграмма, с которой я больше не могу работать.

Я начинаю с DataFrame следующим образом:

Out[75]: 
         First  Second  Third  Fourth  Fifth
Red         27      22     33      20      9
Blue        10      27     18      31     14
Magenta     32      10     11       8     10
Yellow       8       6     14      13     15
Green        9       5      6       6      2

И я бы создал красивую диаграмму с названиями цветов по оси, 5 столбцами, сложенными в том же порядке, что и легенда, которые дадут ранги. Например, это результат для составной полосы с 10 рангами и 10 категориями, которую мы создали в 0.9.0:

Составная панель с 10 категориями и 10 рангами

Раньше я делал это просто:

plot = Bar(dataframe, list_of_color_names, title="stack of 5 categorical ranked in order from first to last", stacked=True, legend="top_right", ylabel="count", width=600, height=600)

Где «list_of_colors_names» был просто списком, созданным из индекса DataFrame, но это больше не работает. Я понимаю, что 0.11 сбрасывает "stacked = True", и теперь мы используем "stack", но я все еще не могу заставить его работать.

Примеры на веб-сайте Bokeh предназначены для более простых столбчатых диаграмм, и когда я применяю эту модель к моему DataFrame, я получаю множество ошибок, таких как «объект 'NoneType' не повторяется», но мне явно не хватает более широкой картины о как этот тип сложенного стержня работает в версии 0.11. Здесь есть несколько других обсуждений многослойной панели Bokeh, но они либо для более ранней версии Bokeh (мой код работал в 0.9), либо, казалось, был другим случаем. Какой сейчас самый лучший способ сделать такую ​​сложенную планку?


person jfhannon    schedule 22.01.2016    source источник


Ответы (1)


Я не знаю, единственный ли это способ сделать это, но гистограмма с накоплением в Bokeh 0.11 работает, если вы помещаете все данные в столбец, а не в матрицу. Затем вам необходимо предоставить индексы строк и столбцов матрицы в соответствующих столбцах фрейма данных, которые в приведенном ниже примере кода называются nr и rank. На них ссылаются при вызове метода Bar, где «стек» относится к столбцам в вашем примере матрицы.

import pandas as pd
from bokeh.charts import Bar, show

all_data={
'nr':  [1,2,3,4,5,
        1,2,3,4,5,
        1,2,3,4,5,
        1,2,3,4,5,
        1,2,3,4,5],
'rank':['First','First','First','First','First',
       'Second','Second','Second','Second','Second',
       'Third','Third','Third','Third','Third',
       'Fourth','Fourth','Fourth','Fourth','Fourth',
       'Fifth','Fifth','Fifth','Fifth','Fifth'],
'data':[27,10,32,8,9,
        22,27,10,6,5,
        33,18,11,14,6,
        20,31,8,16,6,
        9,14,10,15,2]
      }
df=pd.DataFrame(all_data)

p=Bar(df,label='nr',values='data',stack='rank',legend='top_right')
show(p)

Комментарий: палитра стандартной гистограммы имеет только шесть цветов, как показано в вашем примере с 10 рангами. Я использую приведенный ниже фрагмент кода, адаптированный из других, чтобы генерировать столько различных цветов, сколько необходимо для гистограммы. В качестве входных данных он использует палитру палитры matplotlib.

import matplotlib.cm as cm
import numpy as np

colormap =cm.get_cmap("jet")
different_colors=10
color_mapping=colormap(np.linspace(0,1,different_colors),1,True)
bokeh_palette=["#%02x%02x%02x" % (r, g, b) for r, g, b in color_mapping[:,0:3]]

p=Bar(df,label='nr',values='data',stack='rank',legend='top_right',palette=bokeh_palette)
show(p)

Вот хорошая страница, на которой обсуждается, как выбрать палитру matplotlib.

person Anadyn    schedule 29.01.2016
comment
Спасибо, Анадын. Это отлично сработало. Думаю, теперь мне просто нужно получать данные в столбцах. Было приятно иметь возможность просто создать диаграмму из матрицы без каких-либо дальнейших изменений, но я признаю, что нетрудно просто сложить данные и сбросить индекс. - person jfhannon; 31.01.2016
comment
Рад, что все получилось! Я согласен с тем, что матричная формулировка более интуитивна. Но когда данные собираются путем запроса к базе данных, как в моем случае, данные сразу поступают в формулировку столбца, и нет необходимости сортировать их в матрице. Тогда код действительно становится короче. - person Anadyn; 01.02.2016