模型BOH KEH

低电平接口

下面是一个概念图,显示了组成Bokeh对象系统的许多最常见的模型类型。为了创建Bokeh图,创建并组装这些对象,然后将这个对象图序列化为JSON。这个JSON表示由BokehJS客户机库使用,它使用它来呈现绘图。

如果空间允许,模型的属性将以内联方式显示。并非所有对象都显示在下面;请参见 参考文献 详细信息。

../../_images/objects.png

模型和特性

底层API的主要组件是模型,模型是具有可以自动序列化的属性的对象,这些属性可以通过某种方式重新构建为BokehJS模型。从技术上讲,模型是继承自 HasProps 在某个时刻:

from bokeh.core.properties import HasProps, Int

class Whatever(HasProps):
    """ `Whatever` model. """

模型可以从其他模型以及提供公共属性集的mixin中派生出来(例如,参见 LineProps 等等 bokeh.core.property_mixins ). 下面是一个示例:

class Another(Whatever, LineProps):
    """ `Another` model. """

模型包含属性,这些属性是类型的类属性 Property ,例如:

class IntProps(HasFields):

    prop1 = Int
    prop2 = Int()
    prop3 = Int(10)

这个 IntProps 模型表示具有三个整数值的对象, prop1prop2prop3 ,它可以从Python自动序列化,并由BokehJS取消序列化。

注解

技术上, prop1 不是的实例 Int ,但是 HasFields 使用自动实例化的元类 Property 必要时上课,所以 prop1prop2 是等价的(尽管是独立的)属性。这对于可读性很有用;如果不需要将任何参数传递给属性的构造函数,那么最好选择前者而不是后者。

属性类型多种多样,包括基本类型,例如:

以及将其他属性作为参数的类似容器的属性:

  • List --- for a list of one type of objects: List(Int)

  • Dict --- for a mapping between two type: Dict(String, Double)

最后是一些特殊的类型,比如:

  • Instance --- to hold a reference to another model: Instance(Plot)

  • Enum --- to represent enumerated values: Enum("foo", "bar", "baz")

  • Either --- to create a union type: Either(Int, String)

  • Range --- to restrict values to a given range: Instance(Plot)

这些属性类型的主要好处是可以执行验证,并且当试图分配无效的类型或值时,会出现有意义的错误报告。

警告

有一个 Any 它是所有其他类型的超类型,并将接受任何类型的值。因为这样可以避免所有的类型验证,所以如果需要的话,一定要少用它。

bokeh.core.properties 详细信息。

一个更复杂、更真实的模型的示例可能如下所示:

class Sample(HasProps, FillProps):
    """ `Sample` model. """

    prop1 = Int(127)
    prop2 = Either(Int, List(Int), Dict(String, List(Int)))
    prop3 = Enum("x", "y", "z")
    prop4 = Range(Float, 0.0, 1.0)
    prop5 = List(Instance(Range1d))

有一个特殊的属性,类似于名为 Include 这使得使用前缀从mixin混合属性变得更简单,例如:

class Includes(HasProps):
    """ `Includes` model. """

    some_props = Include(FillProps)

在本例中,有一个占位符属性 some_props ,将被删除并自动替换为中的所有属性 FillProps ,每个 some_ 作为前缀附加的。

注解

前缀可以是有效的标识符。如果它以 _props 然后 props 将被删除。添加 _props 不是必需的,但如果属性 some 已经并行存在(请参见 Plot.title 作为一个例子)。

使用 Include 相当于写:

class ExplicitIncludes(HasProps):
    """ `ExplicitIncludes` model. """

    some_fill_color = ColorSpec(default="gray")
    some_fill_alpha = DataSpec(default=1.0)

请注意,您可以从 FillProps 在这种情况下:

class IncludesExtends(HasProps, FillProps):
    """ `IncludesExtends` model. """

    some = String
    some_props = Include(FillProps)

但请注意,这相当于:

class ExplicitIncludesExtends(HasProps):
    """ `ExplicitIncludesExtends` model. """

    fill_color = ColorSpec(default="gray")
    fill_alpha = DataSpec(default=1.0)
    some = String
    some_fill_color = ColorSpec(default="gray")
    some_fill_alpha = DataSpec(default=1.0)