为了简化和自动化可用于描述情节和场景的模型的创建和使用,Bokeh提供了属性和属性混合的集合。属性类为大量有用类型的集合提供自动验证和序列化。Mixin和container类可以方便地向模型类批量添加属性。
为Bokeh模型提供属性类型
属性是可以在Bokeh模型上指定为类属性的对象,以提供自动序列化、验证和文档。
本文档分为以下几节:
概述
基本特性
容器属性
DataSpec属性
帮手
特殊属性
仅验证属性
验证控制
例如,在模块中定义了许多属性类型 Int 表示整数值, Seq 表示序列(如列表或元组等)。属性也可以组合: Seq(Float) 表示浮点值序列。
Int
Seq
Seq(Float)
例如,下面定义了一个具有integer、string和list的模型 [浮动] 性能:
class SomeModel(Model): foo = Int bar = String(default="something") baz = List(Float, help="docs for baz prop")
如前所述,属性可以声明为属性类型,例如。 foo = Int ,在这种情况下,属性将自动在新模型对象上实例化。或者属性可以在类上实例化,并使用默认值和帮助字符串进行配置。
foo = Int
可以通过向初始值设定项指定关键字参数来初始化此类的属性:
m = SomeModel(foo=10, bar="a str", baz=[1,2,3,4])
但也可以通过设置实例的属性:
m.foo = 20
尝试将属性设置为错误类型的值将导致 ValueError 例外:
ValueError
>>> m.foo = 2.3 Traceback (most recent call last): << traceback omitted >> ValueError: expected a value of type Integral, got 2.3 of type float
具有属性的模型知道如何序列化自己,这一点BokehJS可以理解。此外,属性上提供的任何帮助字符串都可以通过中的Sphinx扩展轻松自动提取 bokeh.sphinxext 模块。
Angle
接受浮点角度值。
Angle 等于 Float 但在语义上更有意义的情况下提供。
Float
default (float or None, optional) -- 从该属性创建的属性的默认值(默认值:无)
help (str or None, optional) -- 此属性的文档字符串。它将由 bokeh_prop 生成Spinx文档时的扩展。(默认值:无)
serialized (bool, optional) -- 从该属性创建的属性是否应包含在序列化中(默认值:True)
readonly (bool, optional) -- 从该属性创建的属性是否为只读。(默认值:False)
Any
接受所有值。
这个 Any 属性不执行任何验证或转换。
default (obj or None, optional) -- 从该属性创建的属性的默认值(默认值:无)
示例
>>> class AnyModel(HasProps): ... prop = Any() ... >>> m = AnyModel() >>> m.prop = True >>> m.prop = 10 >>> m.prop = 3.14 >>> m.prop = "foo" >>> m.prop = [1, 2, 3]
AnyRef
接受所有值并强制引用发现。
Auto
只接受字符串“auto”。
对于可以配置为“自动”行为的属性非常有用。
此属性通常与 Either 财产。
Either
>>> class AutoModel(HasProps): ... prop = Either(Float, Auto) ... >>> m = AutoModel() >>> m.prop = 10.2 >>> m.prop = "auto" >>> m.prop = "foo" # ValueError !! >>> m.prop = [1, 2, 3] # ValueError !!
Bool
接受布尔值。
>>> class BoolModel(HasProps): ... prop = Bool(default=False) ... >>> m = BoolModel() >>> m.prop = True >>> m.prop = False >>> m.prop = 10 # ValueError !!
Byte
接受整数字节值(0-255)。
>>> class ByteModel(HasProps): ... prop = Byte(default=0) ... >>> m = ByteModel() >>> m.prop = 255 >>> m.prop = 256 # ValueError !! >>> m.prop = 10.3 # ValueError !!
Color
以多种方式接受颜色值。
对于颜色,因为我们支持命名颜色和以“#”开头的十六进制值,所以当我们收到一个字符串值时,会有一些解释:如果该值是147个SVG命名的colors之一,或者它以“#”开头,那么它将被解释为一个值。
如果提供了3元组,则将其视为RGB(0..255)。如果提供了4元组,则将其视为RGBa(0..255),alpha是介于0和1之间的浮点。(这遵循HTML5画布API。)
>>> class ColorModel(HasProps): ... prop = Color() ... >>> m = ColorModel() >>> m.prop = "firebrick" >>> m.prop = "#a240a2" >>> m.prop = (100, 100, 255) >>> m.prop = (100, 100, 255, 0.5) >>> m.prop = "junk" # ValueError !! >>> m.prop = (100.2, 57.3, 10.2) # ValueError !!
Complex
接受复杂浮点值。
default (complex or None, optional) -- 从该属性创建的属性的默认值(默认值:无)
DashPattern
接受虚线规范。
表示描述虚线的模式。 DashPattern 可以用多种方式指定值:
枚举:“实心”、“虚线”、“虚线”、“点线”、“点划线”、“虚线”
中的一个元组或整数列表 HTML5 Canvas dash specification style . 请注意,如果整数列表的元素数为奇数,那么它将被复制,并且这个复制的列表将成为新的短划线列表。
若要指示短划线已关闭(实线),请指定空列表[]。
Date
接受日期(但不接受日期时间)值。
Datetime
接受日期时间值。
根据其他属性类型的序列接受值。
例子:
>>> class EitherModel(HasProps): ... prop = Either(Bool, Int, Auto) ... >>> m = EitherModel() >>> m.prop = True >>> m.prop = 10 >>> m.prop = "auto" >>> m.prop = 10.3 # ValueError !! >>> m.prop = "foo" # ValueError !!
Enum
接受枚举中的值。
枚举中的第一个值用作默认值,除非 default 使用关键字参数。
default
见 bokeh.core.enums 更多信息。
接受浮点值。
>>> class FloatModel(HasProps): ... prop = Float() ... >>> m = FloatModel() >>> m.prop = 10 >>> m.prop = 10.3 >>> m.prop = "foo" # ValueError !!
FontSize
Image
接受图像文件类型,例如PNG、JPEG、TIFF等。
此属性可以配置为:
要加载的字符串文件名 PIL.Image.open
PIL.Image.open
一个RGB(A)NumPy数组将被转换为PNG
A PIL.Image.Image 对象
PIL.Image.Image
在所有情况下,图像数据都序列化为Base64编码的字符串。
Instance
接受的值是 HasProps .
HasProps
接受带符号整数值。
default (int or None, optional) -- 从该属性创建的属性的默认值(默认值:无)
>>> class IntModel(HasProps): ... prop = Int() ... >>> m = IntModel() >>> m.prop = 10 >>> m.prop = -200 >>> m.prop = 10.3 # ValueError !!
Interval
接受给定间隔内包含的数值。
interval_type (numeric property) -- 范围的数字类型,例如。 Int , Float
start (number) -- 范围的最小允许值。值小于 start 将导致验证错误。
start
end (number) -- 范围的最大允许值。值大于 end 将导致验证错误。
end
>>> class RangeModel(HasProps): ... prop = Range(Float, 10, 20) ... >>> m = RangeModel() >>> m.prop = 10 >>> m.prop = 20 >>> m.prop = 15 >>> m.prop = 2 # ValueError !! >>> m.prop = 22 # ValueError !! >>> m.prop = "foo" # ValueError !!
JSON
接受JSON字符串值。
该值由BokehJS作为 一串 包含JSON内容。i、 你必须使用 JSON.parse 将值解压为JavaScript哈希。
JSON.parse
default (string or None, optional) -- 从该属性创建的属性的默认值(默认值:无)
MarkerType
MinMaxBounds
接受(min,max)边界元组以用于范围。
边界以元组的形式提供 (min, max) 所以不管你的范围是增加还是减少,第一项应该是范围的最小值,第二项应该是最大值。设置最小值>最大值将导致 ValueError .
(min, max)
将“边界”设置为“无”将允许您的绘图尽可能地平移/缩放。如果只希望约束打印的一端,可以将“最小”或“最大”设置为 None 例如 DataRange1d(bounds=(None, 12))
None
DataRange1d(bounds=(None, 12))
NonNegativeInt
接受非负整数。
Percent
接受浮点百分比值。
Percent 对于指定诸如alpha值和区段之类的内容,可能非常有用,并且在语义上有意义。
>>> class PercentModel(HasProps): ... prop = Percent() ... >>> m = PercentModel() >>> m.prop = 0.0 >>> m.prop = 0.2 >>> m.prop = 1.0 >>> m.prop = -2 # ValueError !! >>> m.prop = 5 # ValueError !!
PositiveInt
接受正整数。
RGB
接受颜色.RGB价值观。
Regex
接受与给定正则表达式匹配的字符串。
>>> class RegexModel(HasProps): ... prop = Regex("foo[0-9]+bar") ... >>> m = RegexModel() >>> m.prop = "foo123bar" >>> m.prop = "foo" # ValueError !! >>> m.prop = [1, 2, 3] # ValueError !!
Size
接受非负数值。
>>> class SizeModel(HasProps): ... prop = Size() ... >>> m = SizeModel() >>> m.prop = 0 >>> m.prop = 10e6 >>> m.prop = -10 # ValueError !! >>> m.prop = "foo" # ValueError !!
String
接受字符串值。
>>> class StringModel(HasProps): ... prop = String() ... >>> m = StringModel() >>> m.prop = "foo" >>> m.prop = 10.3 # ValueError !! >>> m.prop = [1, 2, 3] # ValueError !!
Struct
接受结构值。
TimeDelta
接受TimeDelta值。
Array
接受NumPy数组值。
ColumnData
接受一个适合作为 data 的属性 ColumnDataSource .
data
ColumnDataSource
这门课是 Dict 它可以有效地处理NumPy数组列的编码。
Dict
接受Python dict值。
如果传入默认值,则每次新使用此属性时都将使用该默认值的浅副本。
List
接受Python列表值。
RelativeDelta
接受时间增量值的RelativeDelta dicts。
接受非字符串排序的值序列,例如list、tuple、array。
Tuple
接受Python元组值。
AngleSpec
A DataSpec 属性,该属性接受数值固定值,并提供关联的units属性来存储角度单位。
DataSpec
单位的可接受值为 "rad" 和 "deg" .
"rad"
"deg"
ColorSpec
A DataSpec 接受的属性 Color 固定值。
这个 ColorSpec 属性尝试首先将字符串值解释为颜色。否则,字符串值将被解释为字段名。例如:
m.color = "#a4225f" # value (hex color string) m.color = "firebrick" # value (named CSS color string) m.color = "foo" # field (named "foo")
可以直接使用dict格式或使用 field() 功能:
field()
m.color = { "field": "firebrick" } # field (named "firebrick") m.color = field("firebrick") # field (named "firebrick")
DataDistanceSpec
A DataSpec 属性,该属性接受数据空间距离的数值固定值,并提供报告的关联单位属性 "data" 作为单位。
"data"
属性的基类,这些属性接受固定值或引用 ColumnDataSource .
许多Bokeh模型都有一些属性,用户可能希望将这些属性设置为单个固定值,或者让属性从数据源中的某一列获取值。作为一个具体的例子,考虑一个带有 x 位置的属性。我们可能需要设置所有被绘制的字形具有相同的位置,比如说 x=10 . 只需能够写下:
x
x=10
glyph.x = 10
或者,根据数据源的“压力”列,可能绘制的每个字形应该具有不同的位置。在这种情况下,我们希望能够写下:
glyph.x = "pressure"
博克 DataSpec 以及子类的一致性。最终,全部 DataSpec 属性解析为字典值,使用 "value" 钥匙,或 "field" 关键点,取决于它的设置方式。
"value"
"field"
例如:
glyph.x = 10 # => { 'value': 10 } glyph.x = "pressure" # => { 'field': 'pressure' }
当浏览器接收到这些底层字典值时,BokehJS知道如何解释它们并采取正确的预期操作(例如,在 x=10 ,或使用 x “压力”列的坐标)。这样,从用户的角度来看,这两个用例都可以用python轻松地表达,而不必处理任何不同的东西。
值得注意的是 DataSpec 也可以使用格式正确的字典值直接设置属性:
glyph.x = { 'value': 10 } # same as glyph.x = 10 glyph.x = { 'field': 'pressure' } # same as glyph.x = "pressure"
Setting the property directly as a dict can be useful in certain situations. For instance some DataSpec subclasses also add a "units" key to the dictionary. This key is often set automatically, but the dictionary format provides a direct mechanism to override as necessary. Additionally, DataSpec can have a "transform" key, that specifies a client-side transform that should be applied to any fixed or field values before they are uses. As an example, you might want to apply a Jitter transform to the x values:
"units"
"transform"
Jitter
glyph.x = { 'value': 10, 'transform': Jitter(width=0.4) }
注意 DataSpec 通常单独使用是没有用的。通常,模型将使用以下子类之一定义属性,例如 NumberSpec 或 ColorSpec . 例如,一个Bokeh模型 x , y 和 color 可以自动处理固定值或列的属性可能如下所示:
NumberSpec
y
color
class SomeModel(Model): x = NumberSpec(default=0, help="docs for x") y = NumberSpec(default=0, help="docs for y") color = ColorSpec(help="docs for color") # defaults to None
DistanceSpec
A DataSpec 属性,该属性接受引用 ColumnDataSource ,还提供了一个关联的单位属性来存储单位信息。单位的可接受值为 "screen" 和 "data" .
"screen"
FontSizeSpec
A DataSpec 接受字体大小固定值的属性。
这个 FontSizeSpec 属性尝试首先将字符串值解释为字体大小(即有效的CSS长度值)。否则,字符串值将被解释为字段名。例如:
m.font_size = "13px" # value m.font_size = "1.5em" # value m.font_size = "foo" # field
所有有效CSS长度单位的完整列表可在此处找到:
https://drafts.csswg.org/css values/#长度
MarkerSpec
A DataSpec 属性,该属性接受标记类型为固定值。
这个 MarkerSpec 属性尝试首先将字符串值解释为标记类型。否则,字符串值将被解释为字段名。例如:
m.font_size = "circle" # value m.font_size = "square" # value m.font_size = "foo" # field
A DataSpec 属性,该属性接受数值和日期时间固定值。
默认情况下,date和datetime值会立即转换为epoch后的毫秒数。可以通过传递来禁用对日期时间值的处理 accept_datetime=False .
accept_datetime=False
默认情况下,timedelta值会立即转换为绝对毫秒。可以通过传递禁用对timedelta值的处理 accept_timedelta=False
accept_timedelta=False
Timedelta值被解释为绝对毫秒。
m.location = 10.3 # value m.location = "foo" # field
PropertyUnitsSpec
A DataSpec 属性,该属性接受数值固定值,并提供关联的units属性来存储单位信息。
ScreenDistanceSpec
A DataSpec 属性,该属性接受屏幕空间距离的数值固定值,并提供报告的关联单位属性 "screen" 作为单位。
StringSpec
A DataSpec 接受字符串固定值的属性。
因为可接受的固定值和字段名都是字符串,所以有必要显式地消除这些可能性的歧义。默认情况下,字符串值被解释为字段,但是 value() 应将函数解释为可以指定的字符串:
value()
m.title = value("foo") # value m.title = "foo" # field
UnitsSpec
A DataSpec 属性,该属性接受数值固定值,并序列化关联的单位值。
expr
方便函数显式返回Bokeh的“expr”规范 DataSpec 财产。
expression (Expression) -- 的计算表达式 DataSpec 财产。
transform (Transform, optional) -- 要应用的变换(默认值:无)
{ "expr": expression }
dict
注解
为了完整起见,包含此函数。属性规范的字符串值默认解释为字段名。
field
方便函数显式返回Bokeh的“field”规范 DataSpec 财产。
name (str) -- 要引用的数据源字段的名称 DataSpec 财产。
{ "field": name }
value
方便函数显式返回Bokeh的“value”规范 DataSpec 财产。
val (any) -- 为指定的固定值 DataSpec 财产。
{ "value": name }
属性规范的字符串值默认解释为字段名。当您希望使用文本属性指定固定值时,此函数尤其有用。
# The following will take text values to render from a data source # column "text_column", but use a fixed value "16px" for font size p.text("x", "y", text="text_column", text_font_size=value("16px"), source=source)
Include
在Bokeh模型中包含“mix-in”属性集合。
见 bokeh.core.property_mixins 了解更多详细信息。
Override
重写派生模型中Bokeh属性的属性。
当Bokeh模型的子类化时,可能需要更改属性本身的一些属性,而不是基类上的属性。这可以使用 Override 班级。
目前, Override 只能用于重写 default 属性的值。
default (obj) -- 子类上此属性的默认值
考虑以下类定义:
from bokeh.model import Model from bokeh.properties import Int, Override class Parent(Model): foo = Int(default=10) class Child(Parent): foo = Override(default=20)
父类具有整数属性 foo 默认值为10。子类使用以下代码:
foo
foo = Override(default=20)
指定 foo 子类实例的属性应为20:
>>> p = Parent() >>> p.foo 10 >>> c = Child() >>> c.foo 20
PandasDataFrame
接受Pandas DataFrame值。
此属性仅用于支持类型验证,例如“accepts”子句。直接添加到boh中是不有用的。
PandasGroupBy
默认情况下,Bokeh属性对值执行类型验证。这有助于确保Python和JavaScript之间交换的任何数据的一致性,并在用户试图设置错误类型的值时向其提供详细和即时的反馈。但是,这些类型检查会产生一些开销。在某些情况下,为了提高性能,可能需要在特定位置关闭验证,甚至完全关闭验证。以下API可用于控制何时进行类型验证。
validate
bokeh特性的控制验证
它可以用作上下文管理器,也可以用作普通的可调用文件
value (bool) -- 是否应该进行验证
with validate(False): # do no validate while within this block pass validate(False) # don't validate ever
参见
validation_on() :检查验证状态
validation_on()
without_property_validation() :函数装饰器
without_property_validation()
without_property_validation
在更新回调期间关闭属性验证
@without_property_validation def update(attr, old, new): # do things without validation
validate :用于更细粒度控制的上下文管理器