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

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

Мой код выглядит следующим образом:

def modify_doc(doc):

    source = ColumnDataSource(ed_montecarlo(num=1000))

    TOOLS = "pan,wheel_zoom,box_zoom,reset,save"

    iter_scatter= figure(x_axis_label='Iteration Number', y_axis_label='Margin', title='Scatter Plot of Iterrations',
                         tools=TOOLS, plot_height=400, plot_width=550)

    iter_scatter.yaxis[0].formatter = NumeralTickFormatter(format = "$0.00")

    dots = iter_scatter.scatter(x='index', y='Margin', source=source, fill_alpha=.5, line_color=None,
                            hover_fill_color='firebrick', hover_alpha=.9, hover_line_color=None, size=10)

    iter_scatter.line(x='index', y='Median Margin', source=source, line_color='cyan', line_width=5, line_alpha=0.8)

    band = Band(base='index', lower='25th Margin', upper='75th Margin', source=source, level='underlay',
            fill_alpha=0.3, line_width=3, line_alpha=.8, line_color='cyan', fill_color='cyan')

    iter_scatter.add_layout(band)

    iter_scatter.add_tools(HoverTool(tooltips=[('Iterration', '@index'),
                                           ('Margin', '$@Margin{%0.2f}')], 
                                 formatters = {'Margin': 'printf',},
                                 renderers = [dots], mode='mouse'))
    def callback(attr, old, new):
        num = iter_slider.value


    iter_slider = Slider(start=100, end=5000, step=100, value=1000, title='Number of Iterations')
    iter_slider.on_change('value', callback) 

    doc.add_root(column(iter_slider, iter_scatter))

show(modify_doc)

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
428
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш обратный вызов не выполняет никакой реальной работы. Вы присваиваете значение ползунка локальной переменной num (которая вообще не имеет никакого другого влияния), а затем немедленно выходите из обратного вызова. Если вы хотите обновить график, вам необходимо обновить источник данных. Вы не сказали, какой тип возвращается ed_montecarlo, но это будет что-то вроде

def callback(attr, old, new):
    source.data = ed_montecarlo(num=iter_slider.value)

Предполагая, что ed_montecarlo возвращает соответствующий Python dict. Если нет, вам необходимо преобразовать его, однако необходимо, чтобы он был Python dict с именами столбцов CDS в качестве ключей и массивами данных в качестве значений.

Спасибо - думаю, я понимаю. Таким образом, функция ed_montecarlo возвращает фрейм данных pandas. Как мне внести это изменение?

Joel 11.09.2018 23:09

Преобразуйте его с помощью метода класса from_df на CDS перед назначением source.databokeh.pydata.org/en/latest/docs/reference/models/…

bigreddot 11.09.2018 23:39

Большое спасибо, что отлично сработало! Я также должен упомянуть, что прошел ваш курс по datacamp и нашел его чрезвычайно полезным, так что мне действительно есть за что вас поблагодарить !!

Joel 11.09.2018 23:53

Спасибо за добрые слова

bigreddot 12.09.2018 01:02

Другие вопросы по теме