Поменять оси после сюжета, созданного в боке - PullRequest
0 голосов
/ 11 июня 2019

Мне нужно поменять оси x и y на графике после того, как объект графика был создан с помощью Bokeh. Я пытался сделать это следующим образом, но получаю следующую ошибку JavaScript:

Ошибка JavaScript: невозможно прочитать свойство 'length' с неопределенным значением

Я думаю, что это возможно из-за этой проблемы с боке со связанными PR и gist .

Мне интересно, что я здесь упускаю (или не понимаю), чтобы заставить это работать.

import bokeh.plotting
import bokeh.io

def swap_axes(plot):
    old_x_axis, old_y_axis = plot.below[0], plot.left[0]
    old_x_range, old_y_range = plot.x_range, plot.y_range
    old_x_scale, old_y_scale = plot.x_scale, plot.y_scale

    plot.below = []
    plot.left = []
    plot.add_layout(old_y_axis, 'below')
    plot.add_layout(old_x_axis, 'left')

    plot.x_range, plot.y_range = old_y_range, old_x_range
    plot.x_scale, plot.y_scale = old_y_scale, old_x_scale
    plot.center = plot.center[::-1]

    return plot


fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
counts = [5, 3, 4, 2, 4, 6]

p = bokeh.plotting.figure(x_range=fruits, plot_height=250, title="Fruit Counts",
                          toolbar_location=None, tools="")
p.vbar(x=fruits, top=counts, width=0.9)

bokeh.io.show(p)
bokeh.io.show(swap_axes(p))

Working vs error output

1 Ответ

2 голосов
/ 11 июня 2019

Непонятно, зачем вам понадобится , чтобы таким образом обновить график на месте вне серверного приложения Bokeh, которое фактически синхронизирует живые объекты во время выполнения Python / JS. В автономном выводе HTML буквально нет важного способа, которым один график, используемый для двух отдельных файлов, можно было бы отличить от двух графиков, используемых для создания двух отдельных файлов.

Несмотря на это, этот конкретный вид реорганизации будет особенно проблематичным с Боке, так как есть очень много пьес, которые нужно правильно перетасовать. Помимо того, что у вас есть выше, тикеры для осей также приводят в действие решетки, которые должны быть исправлены. Эта строка: plot.center = plot.center[::-1] ничего не использует (она не меняет способ настройки сеток, а только порядок их прорисовки). Возможно, есть и другие вещи, которые нужно поменять местами.

Это нетривиальная задача, и в основном никто не просил ее через ~ 6 лет, поэтому мы не вложили ни одного из очень ограниченных ресурсов проекта, чтобы упростить ее. Мой совет, как одного из ведущих разработчиков ядра, заключается в том, что вы должны создать функцию, которая может возвращать две версии графика на основе параметра flag и показывать два отдельных графика:

show(make_plot(swapped=False))
show(make_plot(swapped=True))

Также:

но просто получите ошибку JavaScript.

Для дальнейшего использования, если есть сообщение об ошибке, оно должно всегда, всегда, всегда включаться в вопрос.

...