Как получить вертикальную линию в полный рост с надписью легенды в holoviews + bokeh? - PullRequest
1 голос
/ 07 марта 2019

Я хочу построить вертикальную линию в 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

без метки для вертикальной линии. Как заставить лейбл показываться?

1 Ответ

2 голосов
/ 07 марта 2019

Как уже упоминалось в этой проблеме , но еще не в документах, 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

Обходной путь 2

Используется как VLine, так и Spikes.Шип не будет виден, за исключением того, что он внесет запись в легенду.Vline будет на вершине шипа, и Vlines уже настраиваются, чтобы заполнить всю высоту фигуры.Это требует создания дополнительного элемента, но это более надежно, потому что вы можете наложить произведение этого шипа и vline на любые другие элементы и все же получить линию, которая заполняет высоту графика и появляется в легенде.Поскольку запись легенды основана на пике, она будет выглядеть как vline только в том случае, если вы убедитесь, что они имеют одинаковый внешний вид (например, vline и spike имеют одинаковый цвет).

# 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, будем надеяться, масштабируется до полной высоты, если явно не задана высота, и тогда эти обходные пути не понадобятся.

...