Python 选择直方图轴数据更新

Python 选择直方图轴数据更新,python,histogram,bokeh,axes,Python,Histogram,Bokeh,Axes,我使用bokeh创建了一个选择直方图,其中包含一个中心散点图和直方图作为轴。我还有一个图例,显示分散数据组的名称,单击该数据组时,将隐藏与图例名称关联的数据点。然而,我想知道是否有可能在散点图数据被更新(即显示或隐藏)时更新直方图数据 请记住,我是python和bokeh新手,通常编写简洁的脚本,因此一些代码可能会比较松散,但如果有任何帮助,我将不胜感激。谢谢 import numpy as np import pandas as pd from bokeh.layouts import ro

我使用bokeh创建了一个选择直方图,其中包含一个中心散点图和直方图作为轴。我还有一个图例,显示分散数据组的名称,单击该数据组时,将隐藏与图例名称关联的数据点。然而,我想知道是否有可能在散点图数据被更新(即显示或隐藏)时更新直方图数据

请记住,我是python和bokeh新手,通常编写简洁的脚本,因此一些代码可能会比较松散,但如果有任何帮助,我将不胜感激。谢谢

import numpy as np
import pandas as pd

from bokeh.layouts import row, column
from bokeh.models import BoxSelectTool, LassoSelectTool, Spacer
from bokeh.plotting import figure, show, curdoc
from bokeh.io import output_notebook
from bokeh.models import CategoricalColorMapper
from bokeh.plotting import ColumnDataSource
from bokeh.io import export_png
from bokeh.palettes import Spectral4

data1 = pd.DataFrame({'m/z': np.random.random(100), 'RT': np.random.random(100)})
data2 = pd.DataFrame({'m/z': np.random.random(100), 'RT': np.random.random(100)})
#create array data from each data set for scatter plot
array_data1 = np.array(data1)
array_data2 = np.array(data2)
#create histogram data
##combine 'm/z' values from each data set into new object
x1 = data1[['m/z']]
x2 = data2[['m/z']]
x = pd.concat([x1,x2])
##combine 'RT' values from each data set into new object
y1 = data1[['RT']]
y2 = data2[['RT']]
y = pd.concat([y1,y2])

#create scatterplot figure
p = figure(x_axis_label='m/z',y_axis_label='RT',tools="", 
plot_width=600, plot_height=600, min_border=10, min_border_left=50,
       toolbar_location="above", title="Mass Recovery Comparison")

p.background_fill_color = "#fafafa"
p.select(BoxSelectTool).select_every_mousemove = False
p.select(LassoSelectTool).select_every_mousemove = False

#create loop for scatter plot
for data, name, color in zip([array_data1,array_data2], ['035','044'], 
    Spectral4):
    df = pd.DataFrame(data)
    df.columns = ['m/z','RT']
    p.scatter(df['m/z'], df['RT'], line_width=2, color=color, 
    alpha=0.8, legend=name)

#legend formatting
p.legend.location = "top_right"
p.legend.click_policy="hide"

#create horizontal histogram
hhist,hedges = np.histogram(x,bins=20)
hzeros = np.zeros(len(hedges)-1)
hmax = max(hhist)*1.1

ph = figure(toolbar_location=None, plot_width=p.plot_width, 
plot_height=200, x_range=p.x_range, y_range=(0, hmax), min_border=10, 
    min_border_left=50, y_axis_location="right")
ph.xgrid.grid_line_color = None
ph.yaxis.major_label_orientation = np.pi/4
ph.background_fill_color = "#fafafa"

ph.quad(bottom=0, left=hedges[:-1], right=hedges[1:], top=hhist, 
    color="white", line_color="#3A5785")

#create vertical histogram
vhist, vedges = np.histogram(y, bins=20)
vzeros = np.zeros(len(vedges)-1)
vmax = max(vhist)*1.1

pv = figure(toolbar_location=None, plot_width=200, 
    plot_height=p.plot_height, x_range=(0, vmax),y_range=p.y_range, 
    min_border=10, y_axis_location="right")
pv.ygrid.grid_line_color = None
pv.xaxis.major_label_orientation = np.pi/4
pv.background_fill_color = "#fafafa"

pv.quad(left=0, bottom=vedges[:-1], top=vedges[1:], right=vhist, 
    color="white", line_color="#3A5785")

layout = column(row(p, pv), row(ph, Spacer(width=200, height=200)))

show(layout)

我能解释的最好的情况是,当某个特定的标志符号被隐藏或禁用,或者从交互图例中取消隐藏或取消禁用时,您希望能够执行某些操作。下面的代码说明了如何在一般意义上做到这一点,您希望用真正的代码来替换打印,这些代码可以执行您实际想要的任何更新:

from functools import partial

import pandas as pd

from bokeh.io import curdoc
from bokeh.palettes import Spectral4
from bokeh.plotting import figure
from bokeh.sampledata.stocks import AAPL, IBM, MSFT, GOOG

p = figure(plot_width=800, plot_height=250, x_axis_type='datetime')
p.title.text = 'Click on legend entries to hide lines'

def update(name, attr, old, new):
    # click the legend and see the information print in the console
    print(name, new)

for data, name, color in zip([AAPL, IBM, MSFT, GOOG], ["AAPL", "IBM", "MSFT", "GOOG"], Spectral4):
    df = pd.DataFrame(data)
    df['date'] = pd.to_datetime(df['date'])
    r = p.line(df['date'], df['close'], line_width=2, color=color, alpha=0.8, legend=name)
    r.on_change('visible', partial(update, name))

p.legend.location = 'top_left'
p.legend.click_policy = 'hide'

curdoc().add_root(p)

您好,现在还不清楚您到底在问什么,所以我试着运行代码。但格式设置已关闭,并且缺少您尚未提供的CSV文件。此外,这里还有许多与格式、视觉效果等相关的无关代码。如果您可以将代码缩减到讨论特定问题所需的最低限度,则会更有帮助。您好,谢谢您的输入。我对代码进行了一些编辑,以消除一些不必要的内容,并添加了一些关于代码各部分用途的注释。不确定如何附加正在使用的文件,但文件由两列组成,标题为“m/z”和“RT”,并包含浮点数,例如4.569表示“RT”,349.567表示“m/z”。您可以使用代码中的文件名创建自己的文件,每个文件有两行,只是为了查看代码如何运行。现在代码变小了,更容易查看内容。如果您想更新直方图,那么您可能希望已经有了一个基于选择的直方图更新的完整示例:否则,您唯一的选择将是在JavaScript中重新计算直方图或预先计算所有可能的直方图,并提前发送数据。预计算一切都可以接受吗?对,这就是我获得大部分代码的地方,但问题是他们在代码末尾定义的“更新”函数是对标记为“r”的分散数据执行的。然而,我的分散数据嵌入到for循环中,这使得它无法访问,至少就我所知,这就是为什么我在网上发布,看看是否有一种方法绕过for循环来访问分散数据。对于你的问题,我不知道JavaScript,所以现在,这不是一个选项。好吧,使用show意味着一个独立的Bokeh文档,而不是Bokeh服务器应用程序。如果您想拥有一个Bokeh服务器应用程序,即具有真正的python回调,那么这将需要更改。Bokeh应用程序通常以curdoc.add\u root这样的行结尾。。。并且使用bokeh serve app.py运行,而不使用python app.py在任何情况下,您都已经具有访问权限,标准python语义意味着您可以读取函数外部定义的变量,即两个单独的数据帧。