- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在开发一个带有 Bokeh (0.12.2) 的交互式应用程序,它可以根据特定的交互更新绘图。
现在我使用 slider 来更改图形中字形的位置,但实际上我想访问我的鼠标在特定图形中的位置。
数据集是一个多维矩阵(张量),密集的数据,每个图在特定位置显示一个维度。如果我更改标记符号在一个图上的位置,则其他图也需要更新,这意味着我必须根据更新后的位置对数据集进行切片。
这是一个简单的示例,我尝试使用悬停工具在我的 Bokeh 服务器更新功能中获取鼠标数据:
from bokeh.plotting import figure, ColumnDataSource
from bokeh.models import CustomJS, HoverTool
from bokeh.io import curdoc
s = ColumnDataSource(data=dict(x=[0, 1], y=[0, 1]))
callback = CustomJS(args=dict(s=s), code="""
var geometry = cb_data['geometry'];
var mouse_x = geometry.x;
var mouse_y = geometry.y;
var x = s.get('data')['x'];
var y = s.get('data')['y'];
x[0] = mouse_x;
y[0] = mouse_y;
s.trigger('change');
""")
hover_tool = HoverTool(callback=callback)
p = figure(x_range=(0, 1), y_range=(0, 1), tools=[hover_tool])
p.circle(x='x', y='y', source=s)
def update():
print s.data
curdoc().add_root(p)
curdoc().add_periodic_callback(update, 1000)
不幸的是,服务器只输出:
{'y': [0, 1], 'x': [0, 1]}
{'y': [0, 1], 'x': [0, 1]}
{'y': [0, 1], 'x': [0, 1]}
{'y': [0, 1], 'x': [0, 1]}
有没有办法访问鼠标位置(在 python 代码中)?甚至访问字形的位置就足够了(因为我可以使用一些 javascript 代码更改字形的位置)。
编辑:所以我最近发现我可以使用这个tool_events.on_change() 来达到这个目的。不幸的是,它只适用于 TapTool、LassoSelectTool 和 BoxSelectTool,不适用于 HoverTool:
from bokeh.plotting import figure
from bokeh.io import curdoc
from bokeh.models.tools import BoxSelectTool, TapTool, HoverTool, LassoSelectTool
from bokeh.models.ranges import Range1d
TOOLS = [TapTool(), LassoSelectTool(), BoxSelectTool(), HoverTool()]
p = figure(tools=TOOLS,
x_range=Range1d(start=0.0, end=10.0),
y_range=Range1d(start=0.0, end=10.0))
def tool_events_callback(attr, old, new):
print attr, 'callback', new
p.tool_events.on_change('geometries', tool_events_callback)
curdoc().add_root(p)
基于我在这里找到的答案:How can I get data from a ColumnDataSource object which is synchronized with local variables of Bokeh's CustomJS function? .此解决方案的问题是我无法使用平移并触发 tool_events 回调。我只能单击 (TapTool) 或平移并仅触发一次回调 (Lasso/BoxSelectTool)。我实际上希望在每次鼠标移动时触发这样的回调..
最佳答案
所以我最近发现您可以为此目的使用自定义模型。这意味着,扩展现有工具,例如GestureTool 但实现/覆盖您自己的功能。您需要运行 Bokeh 服务器(显然)。
$ bokeh serve dir_with_mainfile/
我现在使用的是:创建文件 MouseMoveTool.py:
from bokeh.models import Tool
class MouseMoveTool(Tool):
# assuming your models are saved in subdirectory models/
with open('models/MouseMoveTool.coffee', 'r') as f:
controls = f.read()
__implementation__ = controls
然后创建 MouseMoveTool.coffee:
p = require "core/properties"
GestureTool = require "models/tools/gestures/gesture_tool"
class MouseMoveToolView extends GestureTool.View
### Override the _pan function ###
_pan: (e) ->
frame = @plot_model.frame
canvas = @plot_view.canvas
vx = canvas.sx_to_vx(e.bokeh.sx)
vy = canvas.sy_to_vy(e.bokeh.sy)
if not frame.contains(vx, vy)
return null
# x and y are your mouse coordinates relative to the axes values
x = frame.x_mappers.default.map_from_target(vx)
y = frame.y_mappers.default.map_from_target(vy)
# update the model's geometry attribute. this will trigger
# the tool_events.on_change('geometries', ..) callback
# in your python code.
@plot_model.plot.tool_events.geometries = [{x:x, y:y}]
class MouseMoveTool extends GestureTool.Model
default_view: MouseMoveToolView
type: "MouseMoveTool"
tool_name: "Mouse Move Tool"
icon: "bk-tool-icon-pan"
event_type: "pan"
default_order: 13
module.exports =
Model: MouseMoveTool
View: MouseMoveToolView
之后,您可以在 main.py 程序中使用您的工具:
from models.MouseMoveTool import MouseMoveTool
p = figure(plot_width=300, plot_height=300, tools=[MouseMoveTool()])
p.tool_events.on_change('geometries', on_mouse_move)
def on_mouse_move(attr, old, new):
print new[0] # will print {x:.., y:..} coordinates
关于javascript - Bokeh 服务器获取鼠标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39744122/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!