代码之家  ›  专栏  ›  技术社区  ›  Nathan

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

  •  0
  • Nathan  · 技术社区  · 7 年前

    我想画一条垂直线 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

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

    0 回复  |  直到 7 年前
        1
  •  5
  •   Nathan    7 年前

    如中所述 this issue VLine HLine 不要出现在图例中,也没有计划添加对它们的支持(基本上,在 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

    V线 . 刺将不可见,除了它将有助于进入传说。V线将在尖峰的顶端,V线已经调整自己来填充整个图形的高度。这需要创建一个额外的元素,但它更为健壮,因为您可以将此spike和vline的乘积与任何其他元素叠加,仍然可以得到一条填充绘图高度并出现在图例中的线。但是,由于图例条目是基于峰值的,只有确保它们具有相似的外观(例如,峰值和峰值具有相同的颜色),它才会看起来像V线。

    # 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

    未来, 尖刺

    推荐文章