Проблемы с пользовательским расширением Bokeh - PullRequest
0 голосов
/ 18 июня 2020

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

ValueError: ожидался подкласс HasProps, получил класс 'bokeh.models.sources.ColumnDataSource'

, который вызывается, когда класс DrawTool вызывает source = Instance (ColumnDataSource) в строке 80. Я не совсем уверен, что я делаю сейчас неправильно, но моя первая мысль - это как-то связано с используемой мной IDE? В настоящее время я использую spyder (python 3.6) и у меня последнее обновление боке 2.1.0.

Это мой первый опыт работы с расширениями боке, поэтому я довольно невежественен и искал в Интернете помощь, но особо не нашел. Мой текущий код - это именно то, что есть на сайте примеров, но я опубликую его здесь для удобства,

from bokeh.core.properties import Instance
from bokeh.io import output_file, show
from bokeh.models import ColumnDataSource, Tool
from bokeh.plotting import figure
from bokeh.util.compiler import TypeScript

output_file('tool.html')

TS_CODE = """
import {GestureTool, GestureToolView} from "models/tools/gestures/gesture_tool"
import {ColumnDataSource} from "models/sources/column_data_source"
import {PanEvent} from "core/ui_events"
import * as p from "core/properties"

export class DrawToolView extends GestureToolView {
  model: DrawTool

  //this is executed when the pan/drag event starts
  _pan_start(_ev: PanEvent): void {
    this.model.source.data = {x: [], y: []}
  }

  //this is executed on subsequent mouse/touch moves
  _pan(ev: PanEvent): void {
    const {frame} = this.plot_view

    const {sx, sy} = ev
    if (!frame.bbox.contains(sx, sy))
      return

    const x = frame.xscales.default.invert(sx)
    const y = frame.yscales.default.invert(sy)

    const {source} = this.model
    source.get_array("x").push(x)
    source.get_array("y").push(y)
    source.change.emit()
  }

  // this is executed then the pan/drag ends
  _pan_end(_ev: PanEvent): void {}
}

export namespace DrawTool {
  export type Attrs = p.AttrsOf<Props>

  export type Props = GestureTool.Props & {
    source: p.Property<ColumnDataSource>
  }
}

export interface DrawTool extends DrawTool.Attrs {}

export class DrawTool extends GestureTool {
  properties: DrawTool.Props
  __view_type__: DrawToolView

  constructor(attrs?: Partial<DrawTool.Attrs>) {
    super(attrs)
  }

  tool_name = "Drag Span"
  icon = "bk-tool-icon-lasso-select"
  event_type = "pan" as "pan"
  default_order = 12

  static init_DrawTool(): void {
    this.prototype.default_view = DrawToolView

    this.define<DrawTool.Props>({
      source: [ p.Instance ],
    })
  }
}
"""


class DrawTool(Tool):
    __implementation__ = TypeScript(TS_CODE)
    source = Instance(ColumnDataSource)


source = ColumnDataSource(data=dict(x=[], y=[]))

plot = figure(x_range=(0, 10), y_range=(0, 10), tools=[DrawTool(source=source)])
plot.title.text = "Drag to draw on the plot"
plot.line('x', 'y', source=source)

show(plot)

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

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

Оказалось, что моя установка боке была повреждена, как указал Юджин. Я пошел дальше и полностью перестроил боке в соответствии с документами Bokehs в Начало работы . После разветвления последнего репозитория bokeh я столкнулся с проблемой, когда среда anaconda пыталась запустить этот шаг , где я обнаружил несколько поврежденных файлов Openssl, которые мешали мне создать среду.

I нашел это исправление на GitHub , которое сработало для меня с потоком других возможных решений. Выполнив остальные шаги, я успешно запустил настраиваемые расширения локально.

TL; DR: проблема заключалась в повреждении установки боке. Если вы новичок в этом и планируете создавать собственные расширения или использовать модели боке, создайте вилку и клонируйте локальную сборку боке, а не полагайтесь на метод быстрой установки.

0 голосов
/ 18 июня 2020

Ваш код отлично работает с Bokeh 2.1.0. И это не должно иметь ничего общего с IDE, потому что это не должно влиять на свойства времени выполнения вашего кода. Конечно, вы можете запустить скрипт с помощью Python вручную.

Если это все еще дает вам ошибку, возможно, ваша установка Bokeh повреждена. В конце концов, bokeh.models.sources.ColumnDataSource - это подкласс HasProps. Попробуйте создать виртуальную среду с нуля.

Вот что я вижу, когда запускаю ваш код и немного взаимодействую с графиком:

example of a working plot

...