如此问题中所述,但尚未在文档中提及,VLine
和HLine
不会出现在图例中,并且没有计划为它们添加支持(基本上,在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](https://user-images.githubusercontent.com/12573501/53979215-2e480c80-40db-11e9-8875-7ce5a64f3aee.png)
解决方法2
这个解决方法同时使用了VLine
和Spikes
。 Spike不会被显示出来,但它将对图例做出贡献。 Vline将位于Spike的上方,Vlines已经自动调整到填充整个图形的高度。这需要创建额外的元素,但它更加稳健,因为您可以将此Spike和Vline的结果叠加到任何其他元素上,并仍然获得填充绘图高度并出现在图例中的线条。 由于图例条目基于Spike,因此如果确保它们具有相似的外观(例如,Vline和Spike具有相同的颜色),则它只看起来像Vline。
spikes = hv.Spikes([0.5], label="mid").opts(color="black")
vline = hv.VLine(0.5).opts(color="black")
spikes * curve * vline
![image](https://user-images.githubusercontent.com/12573501/53979318-78c98900-40db-11e9-822f-ecffe038b551.png)
在未明确给定高度时,Spikes
希望自动扩展至全高度,届时这些解决方法将不再需要。