在全息视图中访问散景(图形)参数
Accessing bokeh (figure) parameters within holoviews
主要是为了使用 holoviews 的抽取操作,我坚持使用 holoviews,但我 运行 在调整 holoviews 内的散景输出方面受到限制:
要在纯散景中实现“联动平移”,需要分享例如x_range 散景中的参数 bokeh.plotting.figure.Figure 对象
# create a new plot
s1 = figure(plot_width=250, plot_height=250)
# create a new plot and share only one range
s2 = figure(plot_width=250, plot_height=250, x_range=s1.x_range)
如何访问和操作全息视图创建的散景图?
我想直接在全息视图中实现链接平移。
这样做的原因是,为了 在具有 不同 运行ges.
的地块中保持交互性
我知道,全息视图选项 axiswise=True 可以完美地自动调整不同的 运行ges 但似乎这不能仅针对单个轴定义(例如 y-轴),同时在 x 轴上保留链接的平移交互性。
我怎样才能做到这一点?非常感谢!
这个问题有几个不同的答案。让我们从最直接的解决方法开始,即针对 link 一个轴而不是另一个轴。这最容易通过给维度不同的名称来实现,例如只需将其中一个维度命名为默认值 'x' 或 'y':
以外的名称
hv.Curve([1, 2, 3], 'x', 'y') + hv.Curve([1, 2, 3], 'x', 'y2')
准确地说,本例中轴的"identity"是由维度名称、标签和单位决定的。这允许轻松共享表示相同数量的轴。如果你真的需要,你甚至可以给他们不同的 names/labels/units 然后用 xlabel/ylabel 选项覆盖显示的标签。
现在回答你答案的更直白的版本,HoloViews 在后台生成散景模型,然后将它们渲染到屏幕上。您可以定义挂钩,这些挂钩可以在渲染之前修改散景图表示。我当然不会推荐这种方法,但您可以像这样实现与以前的解决方案相同的效果:
ax_range = None
def hook(plot, element):
global ax_range
ax_range = plot.handles['x_range']
def hook2(plot, element):
plot.state.x_range = ax_range
hv.Curve([1, 2, 3], 'x', 'y').opts(hooks=[hook]) + hv.Curve([1, 2, 3], 'x2', 'y').opts(hooks=[hook2], axiswise=True)
最后,我们可以使 linking 更明确,如果您喜欢这种方法,我建议您提交问题以请求将其包含在内。在 HoloViews 1.11 中引入了所谓的 Links,我们可以像这样轻松添加 RangeLink
:
import param
from holoviews.plotting.links import Link
class RangeLink(Link):
x_range = param.Boolean(default=True)
y_range = param.Boolean(default=True)
_requires_target = True
from holoviews.plotting.bokeh.callbacks import LinkCallback
class RangeLinkCallback(LinkCallback):
def __init__(self, root_model, link, source_plot, target_plot):
if link.x_range:
target_plot.handles['x_range'] = source_plot.handles['x_range']
target_plot.state.x_range = source_plot.state.x_range
if link.y_range:
target_plot.handles['y_range'] = source_plot.handles['y_range']
target_plot.state.y_range = source_plot.state.y_range
RangeLink.register_callback('bokeh', RangeLinkCallback)
# Now we can use it to link the axes
curve = hv.Curve([1, 2, 3])
curve2 = hv.Curve([1, 2, 3])
RangeLink(curve, curve2, y_range=False)
curve + curve2.opts(axiswise=True)
主要是为了使用 holoviews 的抽取操作,我坚持使用 holoviews,但我 运行 在调整 holoviews 内的散景输出方面受到限制:
要在纯散景中实现“联动平移”,需要分享例如x_range 散景中的参数 bokeh.plotting.figure.Figure 对象
# create a new plot
s1 = figure(plot_width=250, plot_height=250)
# create a new plot and share only one range
s2 = figure(plot_width=250, plot_height=250, x_range=s1.x_range)
如何访问和操作全息视图创建的散景图?
我想直接在全息视图中实现链接平移。 这样做的原因是,为了 在具有 不同 运行ges.
的地块中保持交互性我知道,全息视图选项 axiswise=True 可以完美地自动调整不同的 运行ges 但似乎这不能仅针对单个轴定义(例如 y-轴),同时在 x 轴上保留链接的平移交互性。
我怎样才能做到这一点?非常感谢!
这个问题有几个不同的答案。让我们从最直接的解决方法开始,即针对 link 一个轴而不是另一个轴。这最容易通过给维度不同的名称来实现,例如只需将其中一个维度命名为默认值 'x' 或 'y':
以外的名称hv.Curve([1, 2, 3], 'x', 'y') + hv.Curve([1, 2, 3], 'x', 'y2')
准确地说,本例中轴的"identity"是由维度名称、标签和单位决定的。这允许轻松共享表示相同数量的轴。如果你真的需要,你甚至可以给他们不同的 names/labels/units 然后用 xlabel/ylabel 选项覆盖显示的标签。
现在回答你答案的更直白的版本,HoloViews 在后台生成散景模型,然后将它们渲染到屏幕上。您可以定义挂钩,这些挂钩可以在渲染之前修改散景图表示。我当然不会推荐这种方法,但您可以像这样实现与以前的解决方案相同的效果:
ax_range = None
def hook(plot, element):
global ax_range
ax_range = plot.handles['x_range']
def hook2(plot, element):
plot.state.x_range = ax_range
hv.Curve([1, 2, 3], 'x', 'y').opts(hooks=[hook]) + hv.Curve([1, 2, 3], 'x2', 'y').opts(hooks=[hook2], axiswise=True)
最后,我们可以使 linking 更明确,如果您喜欢这种方法,我建议您提交问题以请求将其包含在内。在 HoloViews 1.11 中引入了所谓的 Links,我们可以像这样轻松添加 RangeLink
:
import param
from holoviews.plotting.links import Link
class RangeLink(Link):
x_range = param.Boolean(default=True)
y_range = param.Boolean(default=True)
_requires_target = True
from holoviews.plotting.bokeh.callbacks import LinkCallback
class RangeLinkCallback(LinkCallback):
def __init__(self, root_model, link, source_plot, target_plot):
if link.x_range:
target_plot.handles['x_range'] = source_plot.handles['x_range']
target_plot.state.x_range = source_plot.state.x_range
if link.y_range:
target_plot.handles['y_range'] = source_plot.handles['y_range']
target_plot.state.y_range = source_plot.state.y_range
RangeLink.register_callback('bokeh', RangeLinkCallback)
# Now we can use it to link the axes
curve = hv.Curve([1, 2, 3])
curve2 = hv.Curve([1, 2, 3])
RangeLink(curve, curve2, y_range=False)
curve + curve2.opts(axiswise=True)