如何在 holoviews + bokeh 中获得一个带标签的全高度竖线?

4

我想在使用bokeh后端的holoviews中绘制一条竖线,它需要有一个标签以显示在图例中。我需要这条线始终占据整个图表的高度,无论它是独立存在还是与其他元素重叠。如何实现这个目标?

示例

我在示例中添加了曲线图,因为否则即使可以出现在图例中的元素也只会使用它们的标签作为标题。

import numpy as np
import holoviews as hv
hv.extension("bokeh")

x = np.linspace(0, 1)
curve = hv.Curve((x, np.sin(x)), label="sin(x)")
vline = hv.VLine(0.5, label="vline")
curve * vline

这里给出以下的图表:

enter image description here

该图中竖线没有标签。如何让标签显示出来?
2个回答

10

此问题中所述,但尚未在文档中提及,VLineHLine不会出现在图例中,并且没有计划为它们添加支持(基本上,在bokeh中它们是以不同的方式创建的,因此没有一种简单的方法将它们放入图例中)。可以使用Spikes代替。然而,正如另一个问题中所记录的那样,尖峰覆盖效果不佳。特别地,如果没有明确的高度,它们不会调整其高度为绘图的完整高度。以下是我想出的两个解决办法。

解决办法1

您可以显式查找应与垂直线重叠的其他元素的高度,并使用此高度创建正确高度的尖峰。这种方法有效,但非常脆弱,因为您需要全面了解可能与尖峰重叠的所有内容并进行适应。

import numpy as np
import holoviews as hv
hv.extension("bokeh")

x = np.linspace(0, 1)
curve = hv.Curve((x, np.sin(x)), label="sin(x)")
height = curve.data["y"].max() - curve.data["y"].min()
spikes = hv.Spikes(([0.5], [height]), vdims="height", label="mid")
spikes * curve

image

解决方法2

这个解决方法同时使用了VLineSpikes。 Spike不会被显示出来,但它将对图例做出贡献。 Vline将位于Spike的上方,Vlines已经自动调整到填充整个图形的高度。这需要创建额外的元素,但它更加稳健,因为您可以将此Spike和Vline的结果叠加到任何其他元素上,并仍然获得填充绘图高度并出现在图例中的线条。 由于图例条目基于Spike,因此如果确保它们具有相似的外观(例如,Vline和Spike具有相同的颜色),则它只看起来像Vline。

# need to make sure the colors are the same for spikes/vlines
# would look a bit better if I adjusted the spike thickness too
spikes = hv.Spikes([0.5], label="mid").opts(color="black")
vline = hv.VLine(0.5).opts(color="black")

spikes * curve * vline

image

在未明确给定高度时,Spikes希望自动扩展至全高度,届时这些解决方法将不再需要。


0

基于 Nathan 提出的两个解决方法,还有一个第三个非常简单的解决方法,可以使用 Curve。

import numpy as np
import holoviews as hv
hv.extension("bokeh")

x = np.linspace(0, 1)
curve = hv.Curve((x, np.sin(x)), label="sin(x)")
height = (curve.data["y"].min(), curve.data["y"].max())
xpos = 0.5

spikes = hv.Curve(([xpos]*2, height), label="mid")
spikes * curve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接