Управление тиковым форматом holoviews с помощью боке - PullRequest
0 голосов
/ 20 мая 2018

Я делаю простое Curve со значениями по оси X, выраженными в секундах (единицах СИ), со значениями порядка наносекунд.

Я хотел бы отформатировать отметки оси с помощью объекта hv.Dimension, как описано в Как управлять форматом y-tick Holoviews? .Этот пример отлично работает при использовании бэкэнда matplotlib, но не работает при использовании боке (по умолчанию).

В настоящее время у меня есть специальный форматер, который умножает все мои значения на желаемую сумму и задает нужные единицы.

xs = np.linspace(0, 15e-6, 500)
xfmt = lambda x: round(x*1e6, ndigits=3)
c = hv.Curve({'x':xs, 'y':step_lowpass(xs, tau=.1e-6)}, 
             kdims=[hv.Dimension('x', label='Time', unit='$\mu$s', value_format=xfmt)])

Это прекрасно работает при использовании бэкэнда matplotlib, однако при использовании бэкэнда Bokeh он не работает, выдавая следующее предупреждение:

WARNING:root:main: x dimension formatter could not be converted to tick formatter. Pyscript raised an error: list index out of range

И не используется форматер.Я также попытался напрямую указать объект bokeh.models.formatters.FuncTickFormatter в качестве аргумента для value_format, однако это не работает, так как эти объекты не могут вызываться напрямую, а вместо этого содержат код, необходимый для форматирования тика в качестве атрибута.

1 Ответ

0 голосов
/ 21 мая 2018

value_format - это функция Python, которая была преобразована в код JavaScript с помощью flexx.pyscript.py2js().Так как в holoviews есть ошибка, то, когда у вас есть несколько операторов, JavaScript не будет работать.

Вы можете использовать следующую функцию, чтобы обойти ошибку:

def xfmt(x):
    return "%f" % (Math.round(eval("x * 1e9")) / 10e3)
...