下面是一个概念图,显示了组成Bokeh对象系统的许多最常见的模型类型。为了创建Bokeh图,创建并组装这些对象,然后将这个对象图序列化为JSON。这个JSON表示由BokehJS客户机库使用,它使用它来呈现绘图。
如果空间允许,模型的属性将以内联方式显示。并非所有对象都显示在下面;请参见 参考文献 详细信息。
底层API的主要组件是模型,模型是具有可以自动序列化的属性的对象,这些属性可以通过某种方式重新构建为BokehJS模型。从技术上讲,模型是继承自 HasProps 在某个时刻:
from bokeh.core.properties import HasProps, Int class Whatever(HasProps): """ `Whatever` model. """
模型可以从其他模型以及提供公共属性集的mixin中派生出来(例如,参见 LineProps 等等 bokeh.core.property_mixins ). 下面是一个示例:
LineProps
class Another(Whatever, LineProps): """ `Another` model. """
模型包含属性,这些属性是类型的类属性 Property ,例如:
Property
class IntProps(HasFields): prop1 = Int prop2 = Int() prop3 = Int(10)
这个 IntProps 模型表示具有三个整数值的对象, prop1 , prop2 和 prop3 ,它可以从Python自动序列化,并由BokehJS取消序列化。
prop1
prop2
prop3
注解
技术上, prop1 不是的实例 Int ,但是 HasFields 使用自动实例化的元类 Property 必要时上课,所以 prop1 和 prop2 是等价的(尽管是独立的)属性。这对于可读性很有用;如果不需要将任何参数传递给属性的构造函数,那么最好选择前者而不是后者。
Int
HasFields
属性类型多种多样,包括基本类型,例如:
Byte
Float
Complex
String
以及将其他属性作为参数的类似容器的属性:
List --- for a list of one type of objects: List(Int)
List
List(Int)
Dict --- for a mapping between two type: Dict(String, Double)
Dict
Dict(String, Double)
最后是一些特殊的类型,比如:
Instance --- to hold a reference to another model: Instance(Plot)
Instance
Instance(Plot)
Enum --- to represent enumerated values: Enum("foo", "bar", "baz")
Enum
Enum("foo", "bar", "baz")
Either --- to create a union type: Either(Int, String)
Either
Either(Int, String)
Range --- to restrict values to a given range: Instance(Plot)
Range
这些属性类型的主要好处是可以执行验证,并且当试图分配无效的类型或值时,会出现有意义的错误报告。
警告
有一个 Any 它是所有其他类型的超类型,并将接受任何类型的值。因为这样可以避免所有的类型验证,所以如果需要的话,一定要少用它。
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混合属性变得更简单,例如:
Include
class Includes(HasProps): """ `Includes` model. """ some_props = Include(FillProps)
在本例中,有一个占位符属性 some_props ,将被删除并自动替换为中的所有属性 FillProps ,每个 some_ 作为前缀附加的。
FillProps
前缀可以是有效的标识符。如果它以 _props 然后 props 将被删除。添加 _props 不是必需的,但如果属性 some 已经并行存在(请参见 Plot.title 作为一个例子)。
_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)