Как обновить Pretext в Bokeh с помощью инструмента Select - PullRequest
0 голосов
/ 04 июня 2018

У меня есть боке-график, который обновляет мой график с помощью инструмента выбора.Инструмент выбора содержит темы, которые обновляют график, где значения x='Polarity' и y='Subjectivity'.

Вот фиктивные данные для того, что я хочу:

import pandas as pd
import random

list_type = ['All', 'Compliment', 'Sport', 'Remaining', 'Finance', 'Infrastructure', 'Complaint', 'Authority',
 'Danger', 'Health', 'English']



df = pd.concat([pd.DataFrame({'Subject' : [list_type[i] for t in range(110)], 
                   'Polarity' : [random.random() for t in range(110)],
                   'Subjectivity' : [random.random() for t in range(110)]}) for i in range(len(list_type))], axis=0)

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

options = []
options.append('All')

options.extend(df['Subject'].unique().tolist())
source = ColumnDataSource(df)

p = figure()
r = p.circle(x='Polarity', y='Subjectivity', source = source)

select = Select(title="Subject",  options=options, value="All")
output_notebook()

def update_plot(attr, old, new):
    if select.value=="All":
        df_filter = df.copy()
    else:
        df_filter = df[df['Subject']==select.value]
    source1 = ColumnDataSource(df_filter)
    r.data_source.data = source1.data
select.on_change('value', update_plot)
layout = column(row(select, width=400), p)
#show(layout)
curdoc().add_root(layout)

Я хочу добавить «Предлог» с df.describe(), который можно обновить с помощью графика с помощью инструмента выбора.Я попробовал это, добавив эти коды, но ничего не отображается:

stats = PreText(text='', width=500)
t1 = select.value

def update_stats(df, t1):
    stats.text = str(df[[t1, select.value+'_returns']].describe())


select.on_change('value', update_plot, update_stats)
layout = column(row(select, width=400), p, stats)
curdoc().add_root(layout)

show(layout)

Кто-нибудь знает решение?Спасибо!

1 Ответ

0 голосов
/ 06 июня 2018

Вам не нужны две отдельные функции для этого, вы можете просто изменить исходную функцию update_plot, чтобы добавить оператор, чтобы изменить текст для PreText на stats.text = str(df_filter.describe()).Функция будет выглядеть следующим образом -

def update_plot(attr, old, new):
    if select.value=="All":
        df_filter = df.copy()
    else:
        df_filter = df[df['Subject']==select.value]
    source1 = ColumnDataSource(df_filter)
    r.data_source.data = source1.data
    stats.text = str(df_filter.describe())

Весь код

from bokeh.models.widgets import Select, PreText
from bokeh.layouts import column, row
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, curdoc
from bokeh.plotting import figure, show
import pandas as pd
import random


list_type = ['All', 'Compliment', 'Sport', 'Remaining', 'Finance', 'Infrastructure', 'Complaint', 'Authority',
 'Danger', 'Health', 'English']



df = pd.concat([pd.DataFrame({'Subject' : [list_type[i] for t in range(110)], 
                   'Polarity' : [random.random() for t in range(110)],
                   'Subjectivity' : [random.random() for t in range(110)]}) for i in range(len(list_type))], axis=0)

options = []
options.append('All')

options.extend(df['Subject'].unique().tolist())
source = ColumnDataSource(df)

p = figure()
r = p.circle(x='Polarity', y='Subjectivity', source = source)

select = Select(title="Subject",  options=options, value="All")
#output_notebook()

stats = PreText(text=str(df.describe()), width=500)

def update_plot(attr, old, new):
    if select.value=="All":
        df_filter = df.copy()
    else:
        df_filter = df[df['Subject']==select.value]
    source1 = ColumnDataSource(df_filter)
    r.data_source.data = source1.data
    stats.text = str(df_filter.describe())


select.on_change('value', update_plot)
layout = column(row(select, width=400), p, stats)
#show(layout)
curdoc().add_root(layout)
...