如何使用Python使我的bokeh vbar交互?

2024-05-29 08:01:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试建立一个POC模型,在这个模型中我可以添加一些交互性(比如根据vbar图的变化选择学生)。我用的是学生的基本数据和他们的分数。在

数据如下:

Column 1
Name
Ayan
Deepa
Sayan
Shobhit

Column 2
Marks
98
96
92
94

我可以通过以下代码实现:

我能够创建函数,并且能够在Bokeh服务器输出中获得输出。我还能够创建on_change回调,根据用户在下拉选择中的输入重新创建数据集。在

我需要帮助的地方:

我无法更新我的绘图源。我尝试了各种各样的方法从不同的在线网站,但我不能这样做。在

面临的一些问题包括:

  1. 当我用dataframe创建ColumnDataSource时,输出图变为空白
  2. 如果我使用dataframe而不是ColumnDataSource,则update函数显示它不能更改df或list

代码:

^{pr2}$

预期结果:我应该能够在页面中查看vbar图表,当我从下拉菜单中更改用户时,绘图也会更改


Tags: 数据函数代码用户name模型绘图dataframe
1条回答
网友
1楼 · 发布于 2024-05-29 08:01:22

这是您的工作代码(适用于bokehv1.0.4)。更改:

x_range = Old_CDS.data['Name']已添加

global Old_CDS_2

Old_CDS_2.data['Marks'] = Old_CDS_1.data['Marks']您正在更新Old_CDS,而不是传递给vbars的{}

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
import os

# # 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(os.path.join(os.path.dirname(__file__), 'Check_Data.csv'), encoding = 'ISO-8859-1')
    Old_Filter = pd.DataFrame(Old[Old.Name == Input])
    Old_Filter.to_csv(os.path.join(os.path.dirname(__file__), 'Old_Filter.csv'), index = False)

    select.options = [(name, name) for name in Old['Name'].values]
    print options

    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

    print Old_CDS.data
    p3 = figure(plot_height = 630, plot_width = 1000, title = "Marks Trend", x_range = Old_CDS.data['Name'],
                   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
    global Old_CDS_2

    Old_CDS_1 = make_dataset(select.value)
    Old_CDS_2.data['Marks'] = Old_CDS_1.data['Marks']

# # 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)

结果:

enter image description here

相关问题 更多 >

    热门问题