【发布时间】:2018-10-21 03:41:51
【问题描述】:
我使用散景创建了一个选择直方图,其中包含一个中心散点图和直方图作为轴。我还有一个图例,它显示散点数据组的名称,单击该图例时,将隐藏与图例名称相关的数据点。但是,我想知道是否可以在更新散点图数据时更新直方图数据(即显示或隐藏)。
请记住,我是 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)
【问题讨论】:
-
您好,您的要求并不清楚,所以我尝试运行代码。但是格式已关闭,并且缺少您尚未提供的 CSV 文件。此外,这里还有很多与格式、视觉效果等相关的无关代码。如果您可以将代码缩减到讨论特定内容所需的最低限度,这总是会更有帮助。
-
您好,感谢您的意见。我稍微编辑了代码以删除一些不必要的东西,并添加了一些关于代码部分用途的 cmets。不确定如何附加正在使用的文件,但文件由标题为“m/z”和“RT”的两列组成,并包含浮点数(例如,“RT”为 4.569,“m/z”为 349.567)。您可以使用代码中的文件名创建自己的文件,并且每个文件有两行,只是为了看看代码是如何运行的。
-
现在代码更小,更容易看到东西。如果你想更新直方图,那么你可能想成为Running a Bokeh Server Application 这里已经有一个完整的直方图更新示例(在这种情况下基于选择):github.com/bokeh/bokeh/blob/master/examples/app/… 否则,你唯一的选择是 在 JavaScript 中重新计算直方图 或预先计算所有可能的直方图 并预先发送它们的数据。预先计算一切都可以接受吗?
-
对,我从那里得到了大部分代码,但问题是他们在代码末尾定义的“更新”函数是在标记为“r”的散点数据上执行的。但是,我的分散数据嵌入在一个 for 循环中,这使得它无法访问(至少据我所知),这就是我在网上发布的原因,看看是否有一种方法可以绕过 for 循环来访问分散数据。对于你的问题,我现在不知道 JavaScript,所以这不是一个选择。
-
嗯,使用
show意味着独立的 Bokeh 文档,不是 Bokeh 服务器应用程序。如果你想拥有一个 Bokeh 服务器应用程序(即有真正的 python 回调),那么这将需要更改。 Bokeh 应用程序通常以curdoc().add_root(...)之类的行结尾,并以bokeh serve app.py运行,not 以python app.py运行。无论如何,您已经拥有访问权限,标准 python 语义意味着您可以读取定义的变量在函数之外,即两个独立的数据框。
标签: python histogram bokeh axes