Arhn - архитектура программирования

Ползунки Bokeh для сложенной vbar для увеличения размера сегмента и HoverTool

В приведенном ниже коде я стремлюсь создать гистограмму с боке, дополненную ползунками, чтобы я мог увеличивать или уменьшать размер каждого сегмента гистограммы и сдвигать остальные по очереди.

Моя проблема сейчас в том, что он не будет обновляться при запуске с боке-сервера. Я предполагаю, что, возможно, боке не выполняет расчеты снова после обновления источника ... Или я получаю конфликт источника. (Пока я реализовал это только для «Инженерии». Хотел заставить это работать, прежде чем я разберусь с остальным.

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

Единственный способ заставить это работать — полностью перерисовать график, я был бы в порядке с этой опцией, но он накладывал графики друг на друга. Есть ли способ очистить все предыдущие графики в Боке? Очевидно, я бы предпочел решение, которое просто изменяет данные, а не полностью перерисовывает график.

from bokeh.plotting import figure, show, curdoc
from bokeh.models import NumeralTickFormatter
from bokeh.models import HoverTool
from bokeh.models import ColumnDataSource
from bokeh.layouts import widgetbox, column
from bokeh.models import CustomJS, Slider
from matplotlib import colors
import pandas as pd
import numpy as np

# Read Data
df=pd.read_csv('/home/mint/SAGD_Costs.csv')


# Master source
source = ColumnDataSource(df)


# Bar Tops Data
engtop = source.data['Engineering'][0]
equiptop = source.data['Engineering'][0] + source.data['Equipment'][0]
bulktop = source.data['Engineering'][0] + source.data['Equipment'][0] + source.data['Bulk_Materials'][0]
inditop = source.data['Engineering'][0] + source.data['Equipment'][0] + source.data['Bulk_Materials'][0] + source.data['Indirects'][0]
labtop = source.data['Engineering'][0] + source.data['Equipment'][0] + source.data['Bulk_Materials'][0] + source.data['Indirects'][0] + source.data['Labour'][0]


# Source for Stupid Hovertool
engsource = ColumnDataSource(data=dict(x=[0], y=[engtop], desc = ['Engineering']))
equipsource = ColumnDataSource(data=dict(x=[0], y=[equiptop-engtop], desc = ['Equipment']))
bulksource = ColumnDataSource(data=dict(x=[0], y=[bulktop-equiptop], desc = ['Bulk Materials']))
indisource = ColumnDataSource(data=dict(x=[0], y=[inditop-bulktop], desc = ['Indirects']))
labsource = ColumnDataSource(data=dict(x=[0], y=[labtop-inditop], desc = ['Labour']))

# HoverTool Label
hover = HoverTool(
    tooltips=[
('Item', '@desc'),
('Cost', '@y{$ 0.00 a}'),
    ]
)


# Other Tools
TOOLS = 'box_zoom, box_select, resize, reset'


# Figure
p = figure(title="Capital Costs Breakdown", title_location="above", plot_width=600, plot_height=600, x_range=(-2, 2), tools=[TOOLS, hover])


# Plots
engbar = p.vbar(x=source.data['Year'][0], width=2, bottom=0,
   top=engtop, alpha=0.75, color="darkslategrey", legend="Engineering", source=engsource)

equipbar = p.vbar(x=[source.data['Year'][0]], width=2, bottom=engtop, 
   top = equiptop, alpha=0.75, color="teal", legend="Equipment", source=equipsource)

bulkbar = p.vbar(x=[source.data['Year'][0]], width=2, bottom=equiptop, 
   top=bulktop, alpha=0.75, color="cyan", legend="Bulk Materials", source=bulksource)

indibar = p.vbar(x=[source.data['Year'][0]], width=2, bottom=bulktop, 
   top=inditop, alpha=0.75, color="powderblue", legend="Indirects", source=indisource)

labbar = p.vbar(x=[source.data['Year'][0]], width=2, bottom=inditop, 
   top=labtop, alpha=0.75, color="lavender", legend="Labour", source=labsource)


# Format
p.yaxis[0].formatter = NumeralTickFormatter(format="$0,000")


# Set up widgets
eng_slider = Slider(start=5000000, end=100000000, value=40000000, step=5000000, title="Engineering")


def update_data(attrname, old, new):

    # Get the current slider values
    a = eng_slider.value


    # Generate the new curve
    df['Engineering'][0] = a


    source = ColumnDataSource(df)
    #source.data = dict(x=x, y=y)


for w in [eng_slider]:
    w.on_change('value', update_data)


# Set up layouts and add to document
inputs = widgetbox(eng_slider)


# Show!
curdoc().add_root(column(inputs, p))
curdoc().title = "Sliders"

Изображение текущего графика

Набор данных


Ответы:


1

Не уверен, что это этикет при ответе на ваш собственный вопрос ... В основном это исправлено, однако Hovertools работает неправильно. Поскольку Hovertool имеет @y, он показывает общее количество стека для каждого элемента. Я хочу показать разницу. Можно ли рассчитать значение для HoverTool?

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

Правильный способ — выполнять любые вычисления в функции обновления

Если вы пришли из Pandas & Matplotlib, как и я, вы можете в конечном итоге встроить вызовы столбцов df в свои диаграммы, например. x = df['Имя_столбца'][0]. Я считаю, что при построении с помощью глифов в боке правильный способ — создать источник с нужными вам данными, чтобы вы могли просто передать x и y в свой глиф. См. «Основной источник», «Получить исходные данные», «Рассчитать верх и низ» и «Новые источники» из моего кода ниже.

# Read Data
df=pd.read_csv('/home/mint/SAGD_Costs.csv')


# Master source
source = ColumnDataSource(df)


# Get source data
a = source.data['Engineering'][0]
b = source.data['Equipment'][0]
c = source.data['Bulk_Materials'][0]
d = source.data['Indirects'][0]
e = source.data['Labour'][0]

# Calculate Top & Bottom
ab = 0
at = a
bb = a
bt = a + b
cb = a + b
ct = a + b + c
db = a + b + c
dt = a + b + c + d
eb = a + b + c + d
et = a + b + c + d + e


# New sources
engsource = ColumnDataSource(data=dict(x=[ab], y=[at], desc = ['Engineering']))
equipsource = ColumnDataSource(data=dict(x=[bb], y=[bt], desc = ['Equipment']))
bulksource = ColumnDataSource(data=dict(x=[cb], y=[ct], desc = ['Bulk Materials']))
indisource = ColumnDataSource(data=dict(x=[db], y=[dt], desc = ['Indirects']))
labsource = ColumnDataSource(data=dict(x=[eb], y=[et], desc = ['Labour']))


# HoverTool Label
hover = HoverTool(
        tooltips=[
    ('Item', '@desc'),
    ('Cost', '@y{$ 0.00 a}'),
        ]
    )


# Other Tools
TOOLS = 'box_zoom, box_select, resize, reset'


# Figure
p = figure(title="Capital Costs Breakdown", title_location="above", plot_width=600, plot_height=600, x_range=(-2, 2), tools=[TOOLS, hover])


# Plots
engbar = p.vbar(x=0, width=2, bottom = 'x',
       top ='y', alpha=0.75, color="darkslategrey", legend="Engineering", source=engsource)

equipbar = p.vbar(x=0, width=2, bottom = 'x', 
       top = 'y', alpha=0.75, color="teal", legend="Equipment", source=equipsource)

bulkbar = p.vbar(x=0, width=2, bottom = 'x', 
       top ='y', alpha=0.75, color="cyan", legend="Bulk Materials", source=bulksource)

indibar = p.vbar(x=0, width=2, bottom = 'x', 
       top ='y', alpha=0.75, color="powderblue", legend="Indirects", source=indisource)

labbar = p.vbar(x=0, width=2, bottom = 'x', 
       top = 'y', alpha=0.75, color="lavender", legend="Labour", source=labsource)


# Format
p.yaxis[0].formatter = NumeralTickFormatter(format="$0,000")


# Set up widgets
eng_slider = Slider(start=5000000, end=100000000, value=40000000, step=5000000, title="Engineering")
equip_slider = Slider(start=5000000, end=100000000, value=40000000, step=5000000, title="Equipment")
bulk_slider = Slider(start=5000000, end=100000000, value=40000000, step=5000000, title="Bulk_Materials")
indi_slider = Slider(start=5000000, end=100000000, value=40000000, step=5000000, title="Indirects")
lab_slider = Slider(start=5000000, end=100000000, value=40000000, step=5000000, title="Labour")

def update_data(attrname, old, new):

    # Get the current slider values
    a = eng_slider.value
    b = equip_slider.value
    c = bulk_slider.value
    d = indi_slider.value
    e = lab_slider.value

    # Calculate Top & Bottom
    ab = 0
    at = a
    bb = a
    bt = a + b
    cb = a + b
    ct = a + b + c
    db = a + b + c
    dt = a + b + c + d
    eb = a + b + c + d
    et = a + b + c + d + e


    # New sources
    engsource.data=dict(x=[ab], y=[at], desc = ['Engineering'])
    equipsource.data=dict(x=[bb], y=[bt], desc = ['Equipment'])
    bulksource.data=dict(x=[cb], y=[ct], desc = ['Bulk Materials'])
    indisource.data=dict(x=[db], y=[dt], desc = ['Indirects'])
    labsource.data=dict(x=[eb], y=[et], desc = ['Labour'])



for w in [eng_slider, equip_slider, bulk_slider, indi_slider, lab_slider]:
    w.on_change('value', update_data)


# Set up layouts and add to document
inputs = widgetbox(eng_slider, equip_slider, bulk_slider, indi_slider, lab_slider)


# Show!
curdoc().add_root(column(inputs, p))
curdoc().title = "Sliders"
18.04.2017
  • ОТВЕТ HOVERTOOLS, я не знал, что вы можете добавить дополнительные вычисляемые переменные в ColumnDataSource, а затем использовать функцию @, чтобы ссылаться на них из подсказок, см. ниже. labsource = ColumnDataSource(data=dict(x=[eb], y=[et], desc=['Labour'], info=[et-dt])) phover = HoverTool( tooltips=[ ('Item', '@desc'), ('Cost', '@info{$ 0.00 a}'), ], ) 24.04.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..