Как контролировать количество стеков с помощью одного виджета выбора в Python Bokeh - PullRequest
0 голосов
/ 11 октября 2019

Я создал вертикальную столбчатую диаграмму с накоплением, используя python bokeh для входного набора данных df, используя следующий код -

print(df.head())

  YearMonth         A         B         C         D         E
0    Jan'18  1587.816  1586.544   856.000  1136.464  1615.360
1    Feb'18  2083.024  1847.808  1036.000  1284.016  2037.872
2    Mar'18  2193.420  1850.524  1180.000  1376.028  2076.464
3    Apr'18  2083.812  1811.636  1192.028  1412.028  2104.588
4    May'18  2379.976  2091.536  1452.000  1464.432  2400.876

Код столбчатой ​​диаграммы с накоплением -

products = ['python', 'pypy', 'jython']
customers = ['Cust 1', 'Cust 2']
colours = ['red', 'blue']
data = {
    'products': products,
    'Cust 1': [200, 850, 400],
    'Cust 2': [600, 620, 550],
    'Retail 1' : [100, 200, 300],
    'Retail 2' : [400,500,600]
}


source = ColumnDataSource(data)
# Set up widgets
select=Select(options=['customers','retailers'],value='customers')
def make_plot() :
    p=figure()
    #p.title.text=select.value
    if select.value=='customers' :
        customers=['cust 1','cust 2']
    else :
        customers=['Retail 1','Retail 2']   
    p.hbar_stack(customers, y='products', height=0.5, source=source, color=colours)
    return p



layout = column(select, make_plot())           

# Set up callbacks
def update_data(attrname, old, new):
    p = make_plot()    # make a new plot
    layout.children[1] = p


select.on_change('value', update_data)

# # Set up layouts and add to document
curdoc().add_root(layout)

Теперь я хочуограничить количество сегментов (т. е. уложенных столбцов) с помощью виджета (предпочтительно с помощью одного виджета выбора). Может ли кто-нибудь, пожалуйста, сообщите мне, как я могу достичь, используя функцию Bokeh служить. Я не хочу использовать функцию обратного вызова Javascript.

1 Ответ

0 голосов
/ 13 октября 2019

Для этого потребуется некоторая нетривиальная работа. Метод vbar_stack - это вспомогательная функция, которая на самом деле создает несколько средств визуализации глифов , по одному для каждой "строки" в начальном стековании. Более того, все средства визуализации связаны друг с другом через преобразование Stack, которое объединяет все предыдущие средства визуализации на каждом шаге. Так что на самом деле не существует простого способа изменить количество строк, которые складываются после факта. Настолько, что я бы предложил просто удалить и заново создать весь график в каждом обратном вызове. (Обычно я бы не рекомендовал такой подход, но эта ситуация является одним из немногих исключений.)

Поскольку вы не указали полный код или даже не упомянули, какой виджет вы хотите использовать, все, что я могу предоставить, это высокийЭскиз уровня кода. Вот полный пример, который обновляет график на основе выбранного виджета:

from bokeh.layouts import column
from bokeh.models import Select
from bokeh.plotting import curdoc, figure

select = Select(options=["1", "2", "3", "4"], value="1")

def make_plot():
    p = figure()
    p.circle(x=[0,2], y=[0, 5], size=15)
    p.circle(x=1, y=float(select.value), color="red", size=15)
    return p

layout = column(select, make_plot())

def update(attr, old, new):
    p = make_plot()    # make a new plot
    layout.children[1] = p  # replace the old plot

select.on_change('value', update)

curdoc().add_root(layout)

Примечание. Я изменил ваш show вызов на curdoc().add_root, так как никогда не полезно вызывать show на сервере Bokehприменение. Возможно, вы захотите обратиться и изучить главу Руководства пользователя Запуск сервера Bokeh для получения справочной информации, если это необходимо.

...