Renderer не обновляет глиф на сюжете в bokehjs - PullRequest
0 голосов
/ 23 сентября 2018

ОБНОВЛЕНИЕ 25-09-2018

В попытке создать более простую демоверсию (размещено здесь: http://jsfiddle.net/bLgj4vc7/3/) для этого вопроса, я, наконец, обнаружил основную причинупроблема. Мне также удалось обойти это, что я опубликовал в качестве ответа.


Я использую автономные bokehjs в моем веб-приложении. Моя проблема заключается в том, что средство визуализации не обновляет свой глиф строкис обновленным источником данных (или, по крайней мере, именно так выглядит проблема для меня).

Этот jsfiddle: http://jsfiddle.net/uwnqcotg/8/ демонстрирует проблему. Пожалуйста, игнорируйте все плохие соглашения о кодировании, это быстро,одноразовая демонстрация.

В скрипте на графике загружены наборы данных, которые отображаются нормально и элегантно. Сюжет можно обновить двумя способами:

  1. Update Plot Once By Overwriting CDS.data Object перезаписывает объект ColumnDataSource.data за один раз, придерживаясь принципа bokeh поддержания одинаковой длины столбца.

  2. Start Stream With CDS.stream использует ColumnDataSource.stream () и обновляетсюжет в обычном яnterval со случайно сгенерированными, но инкрементными сериями данных.

При первом подходе выглядит, что глиф обновляется - верные оси обновляются в соответствии с наборами данных , напечатанными вконсоль для справки .Но нанесенный на карту глиф и базы данных показывают несоответствие.Для меня это выглядит как глиф, нанесенный на график, когда инициализированный график просто перенастроен на новые оси, хотя я не могу быть уверен.

Во втором подходе, опять же, оси обновляются, но глиф не«т.Опять же, первоначально построенный глиф, кажется, заново подстраивается под новые диапазоны осей.Кроме того, rollover attr, кажется, игнорируется, поскольку средство визуализации просто продолжает накапливать данные.

В целом, я заметил, что любые данные, предоставленные для средства визуализации во время его инициализации, отображаются правильно, но любое последующее обновление илидаже перезаписать нет.Хотя я могу ошибаться.

С другой стороны, между мной и боке я склонен полагать, что я делаю что-то не так или что-то упускаю.Так что это?

1 Ответ

0 голосов
/ 25 сентября 2018

Как обновлено в вопросе, в попытке создать более простую демоверсию, размещенную здесь http://jsfiddle.net/bLgj4vc7/3/, Я наткнулся на основную причину этой проблемы:

Похоже, что в bokehjs есть ошибка, в которойрендер, когда-то инициализированный с определенной длиной набора данных, остается на этой длине даже для последующих обновлений в наборе данных.Другими словами,

  1. Если средство визуализации было инициализировано с пустым набором данных {x:[], y:[]}, даже если впоследствии renderer.data_source обновляется с помощью заполненного набора данных, средство визуализации придерживается нулевой длины и ничегонарисован на графике.
  2. Для начального набора данных длиной 5, только первые 5 точек будут считаны из любых последующих обновлений, и глиф будет обновляться соответственно.Остальные точки не подтверждены.

Я не знаю, заключается ли проблема в том, не отображает ли средство рендеринга сверх начальной длины или не выполняет перерисовку глифа на графике.ColumnDataSource уверен, что обновляется правильно.

Скрипка, связанная в этом ответе, лучше всего демонстрирует проблему.

Так, каково решение?На данный момент это обходной путь: инициализируйте средство визуализации с набором данных, заполненным NaN с, длина которого равна или превышает максимальное число точек данных, которые вы хотите построить для одного набора данных.

Итак,если в линейном глифе я хочу построить максимум 100 точек данных, то:

const plot = Bokeh.Plotting.figure()

const maxDataPoints = 100 // maximum number of points I want for this glyph
const emptyData = Array().fill().map(_ => NaN)
const cds = new Bokeh.ColumnDataSource({x: emptyData, y: emptyData})  
const renderer = plot.line({field: 'x'}, {field: 'y'}, {source: cds, line_width: 2})

// now any subsequent updates to datasource of renderer will update its glyph on the plot.
renderer.data_source.data = {
  x: dataLengthLessOrEqualToMaxDataPoints.x,
  y: dataLengthLessOrEqualToMaxDataPoints.y
}

Конечно, я думаю, что такое поведение bokehjs является либо ошибкой, либо я пропускаю недокументированный шаг при инициализации.В любом случае, стоит создать проблему на github: https://github.com/bokeh/bokeh/issues/8277

...