Bokeh - доступ к метке оси из CustomJS вызывает ошибку, но работает в коде Python - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть стандартная цифра

p=figure(plot_width = 1200, plot_height = 600, x_axis_label= "cities", y_axis_label="population")

Я могу изменить метку любой оси с помощью

p.yaxis.axis_label = "something else"

Хотя, если я создаю CustomJS для изменения метки, это выиграетне работаетКогда я перехожу к CustomJS yaxis.axis_label, я получаю сообщение об ошибке:

AttributeError: '_list_attr_splat' object has no attribute 'axis_label'

Это код JS:

callback=CustomJS(args=dict(label=p.yaxis.axis_label), code="""

    var y_label = label;
    y_label.set("something else");

""")

Если вместо этого яПередав просто p.yaxis, а затем попытайтесь получить доступ к JS-коду axis_label, я получаю следующую ошибку на веб-странице:

typeError: y_label is undefined

Это код JS:

callback=CustomJS(args=dict(label=p.yaxis), code="""

    var y_label = label.axis_label;
    y_label.set("something else");

""")

В то время как вы можете ясно видеть, что он был создан в начале.

Это ошибка в Боке или я что-то здесь не так делаю?

1 Ответ

0 голосов
/ 12 декабря 2018

Графики могут иметь более одной оси y, поэтому p.yaxis на самом деле представляет собой список, содержащий все оси y на графике:

>>> p.yaxis
[<bokeh.models.axes.LinearAxis at 0x106fa2390>]

Однако чаще всего присутствует только y-ось.Так что Bokeh имеет удобство, позволяющее установить p.yaxis.label = "foo" без индекса. Это описано в документации Но это работает только с Python, это технически невозможно на стороне Javascript.Там вам нужно будет быть явным и рассматривать p.yaxis как список, например,

p.yaxis[0].axis_label = "foo"

В качестве альтернативы, вы можете передать p.yaxis[0] в диктовку args со стороны Python,что позволит вам ссылаться на него непосредственно:

callback=CustomJS(args=dict(axis=p.yaxis[0]), code="""
    axis.axis_label = "foo"
""")
...