Современный пример сгруппированных гистограмм Bokeh? - PullRequest
0 голосов
/ 26 февраля 2020

Я новичок в Bokeh и Pandas, и я пытаюсь сгруппировать гистограмму из некоторых результатов запроса.

Мои данные выглядят примерно так

Day         Fruit    Count
----------- -------- -------
2020-01-01  Apple    19
2020-01-01  Orange   8
2020-01-01  Banana   7
...
2020-02-23  Apple    15
2020-02-23  Orange   10
2020-02-23  Banana   12
2020-02-24  Apple    12
2020-02-24  Orange   17
2020-02-24  Banana   9

In ответы с старым устаревшим API-интерфейсом bokeh.charts с этим макетом данных, кажется, тривиально.

Мне очень трудно понять, что происходит с сгруппированной диаграммой пример из обновленного API, и как перевести мои данные в формат в формат, показанный в примере.

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

# add a grouped axis for group the bar chart
def grouped_axis (row ):
   return ( row['Day'], row['Fruit'] )

data_frame['day_fruit']=data_frame2.apply ( lambda row: grouped_axis(row), axis=1 )

Может кто-нибудь указать мне на пример, который использует такие данные? Или, если это не удалось, объясните код, который мне нужен, чтобы Боке понял мои данные как сгруппированную гистограмму?

1 Ответ

1 голос
/ 26 февраля 2020

То, что вы ищете, это метод с именем pivot.

Но в этом случае он вам на самом деле не нужен - пример Bokeh, который вы связали, уже имеет дело с Поворотные данные, и поэтому он должен втирать их в приемлемую форму. В то время как с уже имеющейся формой данных вам не нужно много делать.

Ниже вы можете найти пример обоих подходов. Обратите внимание, насколько проще mk_src_2.

import pandas as pd
from bokeh.io import show
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.plotting import figure

data = pd.DataFrame([['2020-01-01', 'Apple', 19],
                     ['2020-01-01', 'Orange', 8],
                     ['2020-01-01', 'Banana', 7],
                     ['2020-02-23', 'Apple', 15],
                     ['2020-02-23', 'Orange', 10],
                     ['2020-02-23', 'Banana', 12],
                     ['2020-02-24', 'Apple', 12],
                     ['2020-02-24', 'Orange', 17],
                     ['2020-02-24', 'Banana', 9]],
                    columns=['day', 'fruit', 'count'])


def mk_src_1(d):
    # Pivoting implicitly orders values.
    d = d.pivot(index='fruit', columns='day', values='count')
    x = [(fruit, day) for fruit in d.index for day in d.columns]
    counts = sum(d.itertuples(index=False), ())
    return ColumnDataSource(data=dict(x=x, counts=counts))


def mk_src_2(d):
    # Bokeh's FactorRange requires the X values to be ordered.
    d = d.sort_values(['fruit', 'day'])
    return ColumnDataSource(data=dict(x=list(zip(d['fruit'], d['day'])),
                                      counts=d['count']))


# source = mk_src_1(data)
source = mk_src_2(data)

p = figure(x_range=FactorRange(*source.data['x']), plot_height=250, title="Fruit Counts by Year",
           toolbar_location=None, tools="")

p.vbar(x='x', top='counts', width=0.9, source=source)

p.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = 1
p.xgrid.grid_line_color = None

show(p)
...