bokeh select 小部件不更新情节
bokeh select widget does not update plot
我一直在关注 Whosebug 上的一些示例,以使用 'select' 小部件更新我的绘图。当我 运行 通过 anaconda shell .py 文件时,我可以看到绘图和 'select' 小部件。不知何故,我的情节并没有更新情节。我必须说数据集有大约 11000 行的计数(我不知道这是否相关)。我看到一个主题,其中将数据框转换为字典帮助某人使交互正常工作。所以我用下面的代码做到了:
from bokeh.layouts import row, column, widgetbox
from bokeh.plotting import figure, show, output_file, ColumnDataSource
from bokeh.models.widgets import Select
from bokeh.io import curdoc, show
df = pd.read_excel('data.xlsx')
d1 = df.to_dict()
d2 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'compliment'].to_dict()
d3 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'complaint'].to_dict()
d4 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'infrastructure'].to_dict()
d5 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'autority'].to_dict()
d6 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'finance'].to_dict()
d7 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'english'].to_dict()
d8 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'danger'].to_dict()
d9 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'health'].to_dict()
d10 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'sport'].to_dict()
d11 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'remaining'].to_dict()
现在我已经制作了字典,我用以下代码制作了情节:
source = ColumnDataSource(df)
p = figure()
r = p.circle(x='Polarity', y='Subjectivity',
source = source)
select = Select(title="Subject", options=['d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'd10', 'd11'])
def update_plot(attr, old, new):
if select.value == 'd1':
newSource = d1
if select.value == 'd2':
newSource = d2
if select.value == 'd3':
newSource = d3
if select.value == 'd4':
newSource = d4
if select.value == 'd5':
newSource = d5
if select.value == 'd6':
newSource = d6
if select.value == 'd7':
newSource = d7
if select.value == 'd8':
newSource = d8
if select.value == 'd9':
newSource = d9
if select.value == 'd10':
newSource = d10
if select.value == 'd11':
newSource = d11
source.data = newSource
select.on_change('value', update_plot)
layout = column(row(select, width=400), p)
curdoc().add_root(layout)
经过多次不同的尝试,我仍然未能使交互正常工作。我做错了什么?
由于您没有提供数据,我使用此代码创建了虚拟数据 -
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)
我一直在关注 Whosebug 上的一些示例,以使用 'select' 小部件更新我的绘图。当我 运行 通过 anaconda shell .py 文件时,我可以看到绘图和 'select' 小部件。不知何故,我的情节并没有更新情节。我必须说数据集有大约 11000 行的计数(我不知道这是否相关)。我看到一个主题,其中将数据框转换为字典帮助某人使交互正常工作。所以我用下面的代码做到了:
from bokeh.layouts import row, column, widgetbox
from bokeh.plotting import figure, show, output_file, ColumnDataSource
from bokeh.models.widgets import Select
from bokeh.io import curdoc, show
df = pd.read_excel('data.xlsx')
d1 = df.to_dict()
d2 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'compliment'].to_dict()
d3 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'complaint'].to_dict()
d4 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'infrastructure'].to_dict()
d5 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'autority'].to_dict()
d6 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'finance'].to_dict()
d7 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'english'].to_dict()
d8 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'danger'].to_dict()
d9 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'health'].to_dict()
d10 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'sport'].to_dict()
d11 = df[['Polarity', 'Subjectivity']].loc[df['Subject'] == 'remaining'].to_dict()
现在我已经制作了字典,我用以下代码制作了情节:
source = ColumnDataSource(df)
p = figure()
r = p.circle(x='Polarity', y='Subjectivity',
source = source)
select = Select(title="Subject", options=['d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'd10', 'd11'])
def update_plot(attr, old, new):
if select.value == 'd1':
newSource = d1
if select.value == 'd2':
newSource = d2
if select.value == 'd3':
newSource = d3
if select.value == 'd4':
newSource = d4
if select.value == 'd5':
newSource = d5
if select.value == 'd6':
newSource = d6
if select.value == 'd7':
newSource = d7
if select.value == 'd8':
newSource = d8
if select.value == 'd9':
newSource = d9
if select.value == 'd10':
newSource = d10
if select.value == 'd11':
newSource = d11
source.data = newSource
select.on_change('value', update_plot)
layout = column(row(select, width=400), p)
curdoc().add_root(layout)
经过多次不同的尝试,我仍然未能使交互正常工作。我做错了什么?
由于您没有提供数据,我使用此代码创建了虚拟数据 -
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)