Python 选择直方图轴数据更新
我使用bokeh创建了一个选择直方图,其中包含一个中心散点图和直方图作为轴。我还有一个图例,显示分散数据组的名称,单击该数据组时,将隐藏与图例名称关联的数据点。然而,我想知道是否有可能在散点图数据被更新(即显示或隐藏)时更新直方图数据 请记住,我是python和bokeh新手,通常编写简洁的脚本,因此一些代码可能会比较松散,但如果有任何帮助,我将不胜感激。谢谢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
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语义意味着您可以读取函数外部定义的变量,即两个单独的数据帧。