python - 如何在holoviews + bokeh中获得带有图例标签的全高垂直线?

标签 python bokeh holoviews

我想在 holoviews 中绘制一条垂直线与 bokeh后端有一个标签显示在我的图例中。我需要这条线是情节的全高,无论它是单独的还是与其他元素重叠。我怎样才能做到这一点?

例子

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

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

它没有垂直线的标签。如何让标签显示出来?

最佳答案

this issue 中所述但尚未在文档中,VLineHLine不要出现在图例中,并且没有计划添加对它们的支持(基本上,在 bokeh 中,它们的创建方式不同,因此将它们放入图例中并不容易)。一个可以用Spikes反而。但是,如 another issue 中所述,尖峰不能很好地叠加。特别是,如果没有给出明确的高度,他们不会将高度调整为图的完整高度。这是我想出的两种解决方法。

解决方法 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

这使用了 VLine和一个 Spikes .尖峰将不可见,只是它会为图例提供一个条目。 vline 将位于尖峰的顶部,并且 vlines 已经调整自身以填充图形的整个高度。这需要创建一个额外的元素,但它更健壮,因为您可以将这个尖峰和 vline 的乘积与任何其他元素叠加,并且仍然得到一条填充图的高度并出现在图例中的线。但是,由于图例条目基于尖峰,因此只有确保它们具有相似的外观(例如 vline 和尖峰具有相同的颜色),它才会看起来像 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

future ,Spikes当没有明确给出高度时,希望将自己缩放为全高,然后就不需要这些变通方法了。

关于python - 如何在holoviews + bokeh中获得带有图例标签的全高垂直线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55050557/

相关文章:

python - kdims 如何处理地理 View 中的多边形?

python - 无法在 hvplot 轴上绘制 datetime64[ns] ('pandas_datetime_types' 未定义'错误)

python - 为什么 gevent.socket 会破坏 multiprocessing.connection 的授权

python - 解析 json 并通过它进行搜索

python - Bokeh - 模型必须仅由单个文档拥有[错误]

javascript - Python Bokeh CustomJS RadioGroup

python - 使用 HoloViews+Bokeh 绘制连接到 HeatMap 的高斯

python - 在仪表板中,根据复选框的值绘制数据集的子集

python - 如何自动将one2many字段值填充到odoo中的另一个one2many字段

slider - RangeTool 更新 Bokeh 中的事件