【发布时间】:2019-02-02 17:25:32
【问题描述】:
我正在尝试开发一个 POC 模型,在该模型中我可以添加一些交互性(例如选择学生,基于该学生的 vbar 图将发生变化)。我正在使用带有他们分数的基本学生数据。
数据如下:
Column 1
Name
Ayan
Deepa
Sayan
Shobhit
Column 2
Marks
98
96
92
94
我可以通过以下代码实现:
我能够创建函数并能够在 Bokeh Server 输出中获得输出。我还可以创建一个 on_change 回调,它根据下拉选择中的用户输入重新创建数据集。
我需要帮助的地方:
我无法更新我的情节中的来源。我尝试了各种在线网站的各种方法,但我无法这样做。
面临的一些问题是:
- 当我使用数据框创建 ColumnDataSource 时,输出图变为空白
- 如果我使用的是数据框而不是 ColumnDataSource,则更新函数显示它无法更改 df 或列表
代码:
## Packages
from bokeh.core.properties import value
from bokeh.io import curdoc
from bokeh.plotting import figure
from bokeh.layouts import layout, column, gridplot, Row, widgetbox, row
from bokeh.models import TapTool, HoverTool, ColumnDataSource, Range1d, BoxSelectTool, LinearAxis, Range1d
from bokeh.models.widgets import Button, RadioButtonGroup, Select, Slider, CheckboxGroup, Panel, Tabs
from bokeh.models.annotations import LabelSet
_tools_to_show = 'box_zoom,pan,save,hover,resize,reset,tap,wheel_zoom'
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import datetime
## Creating Dataset
def make_dataset(Input):
global Piv_INCS2_CD_Plot3old
global Piv_INCS2_CD_Plot3
global Week_List
global P2_Major
global Total_Incidents_Created
global Resolution_SLO_Miss_Percent
global new_src
global Piv_INCS2_CD_Plot3_List
global Old
global Old_Filter
global Old_CDS
global Name
global Marks
global Names2
global Old_CDS_Name
global Old_CDS_Marks
print("select 2 =", select.value )
print("Input 2 =", Input)
Old = pd.read_csv('Check_Data.csv', encoding='ISO-8859-1')
Old_Filter = pd.DataFrame(Old[Old.Name == Input])
Old_Filter.to_csv('Old_Filter.csv')
Name = [Input]
print("Name = ", Name)
Names2 = Old_Filter["Name"].tolist()
Marks = Old_Filter["Marks"].tolist()
print("Names = ", Name )
print("Marks = ", Marks )
Old_CDS = ColumnDataSource(data = Old_Filter)
print("OLD_CDS = ", Old_CDS)
Old_CDS_Name = ColumnDataSource(data = {'Name':Name})
Old_CDS_Marks = ColumnDataSource(data = {'Marks': Marks})
return Old_CDS
## Creating Plot
def plot(Old_CDS):
global p3
p3 = figure(plot_height=630, plot_width=1000, title="Marks Trend",
toolbar_location=None, tools="")
p3.vbar(x = "Name", top = "Marks", width = 0.9, source=Old_CDS)
p3.xgrid.grid_line_color = None
p3.y_range.start = 0
return p3 # returns the plot
## On Change Function
def update(attr, old, new):
global Piv_INCS2_CD_Plot3_New
global Week_List_New
global Old_CDS_1
global p3
global lay
global Old_CDS_Name_2
Old_CDS_1 = make_dataset(select.value)
Old_CDS.data.update(Old_CDS_1.data)
## Selection Option
options=[("Ayan","Ayan"),("Deepa","Deepa")]
select=Select(title="Name",options=options)
print("select=", select.value )
## Changing value based on user input
select.on_change("value",update)
## Defining intial user selection
Initial_Input = "Ayan"
Old_CDS_2 = make_dataset(Initial_Input)
## Defining Layout
p3 = plot(Old_CDS_2)
lay = row(p3, select)
curdoc().add_root(lay)
预期结果:我应该能够在页面中查看 vbar 图表,并且当我从下拉列表中更改用户时,绘图会发生变化
【问题讨论】:
-
我想帮忙,但上面有大量不相关/不相关的代码,这使得检查变得更加困难和耗时。请简化为一个最小独立示例,该示例仅处理创建/更新情节,并显示您为此尝试过的内容。
-
另外,有很多示例可以绘制数据并根据您可以在官方项目示例中研究和比较的小部件进行更新:github.com/bokeh/bokeh/tree/master/examples/app
-
@bigreddot 我上传了一个 csv,其中包含 2 名学生 Ayan 和 Deepa 的一些原始数据。我希望在散景中创建一个 vbar 图表,以便我可以根据用户输入的名称(Ayan/Deepa)显示 vbar 图表。我已将 csv 转换为 columndatasource,并在更改用户输入时调用回调函数。那工作正常。但是当我尝试更新 vbar 中的数据源时,我被困在回调函数中,它没有被执行。
-
回调函数如下: def update(attr, old, new): Old_CDS_1 = make_dataset(select.value) # OLD_CDS_1 - 从数据集创建函数返回的ColumnDataSource func) Old_CDS.data。 update(Old_CDS_1.data) # 我正在更新绘图函数中的新数据源。 plot函数代码如下
-
您可以(并且应该)编辑问题本身。 cmets 中未格式化的代码不可读。