gpt4 book ai didi

python - 两个交互式 Bokeh 图 : select a value in one graph and change the other

转载 作者:行者123 更新时间:2023-11-28 19:38:44 27 4
gpt4 key购买 nike

我想创建一个交互式 python Bokeh 图。我有两个由列名链接的数据框。当我在 plot1 中选择一个条时,我想在 plot 2 中显示属于该列的数据帧 2 (df2) 的数据。例如,df1 可以包含 df2 所有列的平均值。如果单击显示的均值,您可以在第二张图中看到构成均值基础的原始数据。不幸的是,我无法让它工作,也找不到可比较的例子。以下是我到目前为止所拥有的。我假设错误在 mycolumn="@colnames" 中并且 taptool 没有返回我所期望的。下面的源代码根据@bigreddot 的评论更新

import pandas as pd
import numpy as np
from bokeh.models import ColumnDataSource, TapTool
from bokeh.plotting import figure
from bokeh.layouts import row
#from bokeh.plotting import show
from bokeh.io import curdoc

# data for plot 2
df2 = pd.DataFrame({"A" : np.linspace(10, 20, 10),
"B" : np.linspace(20, 30, 10),
"C" : np.linspace(30, 40, 10),
"D" : np.linspace(40, 50, 10),
"E" : np.linspace(50, 60, 10),})
source2 = ColumnDataSource(
data=dict(
x=list(df2.index.values),
y=list(df2.iloc[:,0].values)
)
)

# data for plot 1
df1 = np.mean(df2)
source1 = ColumnDataSource(
data=dict(
x=list(range(0,df1.shape[0])),
y=list(df1.values),
colnames = list(df1.index.values)
)
)

# Plot graph one with data from df1 and source 1 as barplot
plot1 = figure(plot_height=300, plot_width=400, tools="tap")
plot1.vbar(x='x',top='y',source=source1, bottom=0,width =0.5)


# Plot graph two with data from df2 and source 2 as line
plot2 = figure(plot_height=300, plot_width=400, title="myvalues",
tools="crosshair,box_zoom,reset,save,wheel_zoom,hover")
r1 = plot2.line(x='x',y='y',source =source2, line_alpha = 1, line_width=1)
# safe data from plot 2 for later change in subroutine
ds1 = r1.data_source

def update_plot2(mycolumn):
try:
ds1.data['y'] = df2[mycolumn].values
except:
pass

# add taptool to plot1
taptool = plot1.select(type=TapTool)
taptool.callback = update_plot2(mycolumn="@colnames")

#show(row(plot1,plot2))
curdoc().add_root(row(plot1,plot2))

enter image description here

最佳答案

您缺少一个基本概念。 Bokeh 实际上是两个库,Python Bokeh API 和在浏览器中完成所有工作的 JavaScript BokehJS 库。这些片段可以通过两种方式进行交互:

  • 独立文件

    这些是不受 Bokeh 服务器支持的 Bokeh 文档。它们可能有许多工具和交互(例如来自 CustomJS 回调),但它们是单向之旅,生成独立的 HTML、JavaScript 和 CSS,与任何 Python 运行时没有进一步连接。

  • Bokeh 应用

    这些是由 Bokeh 服务器支持的 Bokeh 文档,并自动同步 Python 和 JS 状态。除了独立文档的所有功能外,还可以将事件和工具连接到真正的 Python 回调,以在 Bokeh 服务器中执行。

当您像上面那样使用 output_fileoutput_notebookshow 时,您正在创建一个独立 Bokeh 文档。这意味着一旦文档显示在浏览器中,就完全没有与任何 Python 的连接。特别是,这意味着您不能访问诸如 Pandas Dataframes 或 NumPy 数组之类的东西,也不能在任何回调中使用 Python 代码,因为浏览器对这些或 Python 根本一无所知。您只能按照 JavaScript Callbacks 中所述使用 CustomJS 回调文档的一部分。

如果您需要运行真正的 Python 代码 来响应事件、选择、工具等,这正是 Bokeh 服务器可以提供的。参见 Running a Bokeh Server在文档中。

根据您的数据大小,通过预先发送 Bokeh 数据源中的所有数据并使用 CustomJS,您可以使用 Standlone 文档来完成您想要的操作 在它之间切换的回调。

关于python - 两个交互式 Bokeh 图 : select a value in one graph and change the other,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48629103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com