#-----------------------------------------------------------------------------
# Copyright (c) Anaconda, Inc., and Bokeh Contributors.
# All rights reserved.
#
# The full license is in the file LICENSE.txt, distributed with this software.
#-----------------------------------------------------------------------------
'''
'''
#-----------------------------------------------------------------------------
# Boilerplate
#-----------------------------------------------------------------------------
from __future__ import annotations
import logging # isort:skip
log = logging.getLogger(__name__)
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
# Standard library imports
from math import inf
# Bokeh imports
from ...core.enums import (
CoordinateUnits,
Dimension,
Movable,
Resizable,
)
from ...core.properties import (
Bool,
CoordinateLike,
Enum,
Float,
Include,
Instance,
InstanceDefault,
NonNegative,
Null,
Nullable,
Override,
Positive,
Seq,
UnitsSpec,
field,
)
from ...core.property_aliases import BorderRadius
from ...core.property_mixins import (
LineProps,
ScalarFillProps,
ScalarHatchProps,
ScalarLineProps,
)
from ..common.properties import Coordinate
from ..nodes import BoxNodes, Node
from .annotation import Annotation, DataAnnotation
from .arrows import ArrowHead, TeeHead
#-----------------------------------------------------------------------------
# Globals and constants
#-----------------------------------------------------------------------------
__all__ = (
"Band",
"BoxAnnotation",
"PolyAnnotation",
"Slope",
"Span",
"Whisker",
)
#-----------------------------------------------------------------------------
# General API
#-----------------------------------------------------------------------------
[docs]
class BoxAnnotation(Annotation):
''' Render a shaded rectangular region as an annotation.
See :ref:`ug_basic_annotations_box_annotations` for information on plotting box annotations.
'''
# explicit __init__ to support Init signatures
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
left = Coordinate(default=lambda: Node.frame.left, help="""
The x-coordinates of the left edge of the box annotation.
""").accepts(Null, lambda _: Node.frame.left)
right = Coordinate(default=lambda: Node.frame.right, help="""
The x-coordinates of the right edge of the box annotation.
""").accepts(Null, lambda _: Node.frame.right)
top = Coordinate(default=lambda: Node.frame.top, help="""
The y-coordinates of the top edge of the box annotation.
""").accepts(Null, lambda _: Node.frame.top)
bottom = Coordinate(default=lambda: Node.frame.bottom, help="""
The y-coordinates of the bottom edge of the box annotation.
""").accepts(Null, lambda _: Node.frame.bottom)
left_units = Enum(CoordinateUnits, default="data", help="""
The unit type for the left attribute. Interpreted as |data units| by
default. This doesn't have any effect if ``left`` is a node.
""")
right_units = Enum(CoordinateUnits, default="data", help="""
The unit type for the right attribute. Interpreted as |data units| by
default. This doesn't have any effect if ``right`` is a node.
""")
top_units = Enum(CoordinateUnits, default="data", help="""
The unit type for the top attribute. Interpreted as |data units| by
default. This doesn't have any effect if ``top`` is a node.
""")
bottom_units = Enum(CoordinateUnits, default="data", help="""
The unit type for the bottom attribute. Interpreted as |data units| by
default. This doesn't have any effect if ``bottom`` is a node.
""")
left_limit = Nullable(Coordinate, help="""
Optional left limit for box movement.
.. note::
This property is experimental and may change at any point.
""")
right_limit = Nullable(Coordinate, help="""
Optional right limit for box movement.
.. note::
This property is experimental and may change at any point.
""")
top_limit = Nullable(Coordinate, help="""
Optional top limit for box movement.
.. note::
This property is experimental and may change at any point.
""")
bottom_limit = Nullable(Coordinate, help="""
Optional bottom limit for box movement.
.. note::
This property is experimental and may change at any point.
""")
min_width = NonNegative(Float, default=0, help="""
Allows to set the minium width of the box.
.. note::
This property is experimental and may change at any point.
""")
min_height = NonNegative(Float, default=0, help="""
Allows to set the maximum width of the box.
.. note::
This property is experimental and may change at any point.
""")
max_width = Positive(Float, default=inf, help="""
Allows to set the minium height of the box.
.. note::
This property is experimental and may change at any point.
""")
max_height = Positive(Float, default=inf, help="""
Allows to set the maximum height of the box.
.. note::
This property is experimental and may change at any point.
""")
border_radius = BorderRadius(default=0, help="""
Allows the box to have rounded corners.
.. note::
This property is experimental and may change at any point.
""")
editable = Bool(default=False, help="""
Allows to interactively modify the geometry of this box.
.. note::
This property is experimental and may change at any point.
""")
resizable = Enum(Resizable, default="all", help="""
If `editable` is set, this property allows to configure which
combinations of edges are allowed to be moved, thus allows
restrictions on resizing of the box.
.. note::
This property is experimental and may change at any point.
""")
movable = Enum(Movable, default="both", help="""
If `editable` is set, this property allows to configure in which
directions the box can be moved.
.. note::
This property is experimental and may change at any point.
""")
symmetric = Bool(default=False, help="""
Indicates whether the box is resizable around its center or its corners.
.. note::
This property is experimental and may change at any point.
""")
line_props = Include(ScalarLineProps, help="""
The {prop} values for the box.
""")
fill_props = Include(ScalarFillProps, help="""
The {prop} values for the box.
""")
hatch_props = Include(ScalarHatchProps, help="""
The {prop} values for the box.
""")
hover_line_props = Include(ScalarLineProps, prefix="hover", help="""
The {prop} values for the box when hovering over.
""")
hover_fill_props = Include(ScalarFillProps, prefix="hover", help="""
The {prop} values for the box when hovering over.
""")
hover_hatch_props = Include(ScalarHatchProps, prefix="hover", help="""
The {prop} values for the box when hovering over.
""")
line_color = Override(default="#cccccc")
line_alpha = Override(default=0.3)
fill_color = Override(default="#fff9ba")
fill_alpha = Override(default=0.4)
hover_line_color = Override(default=None)
hover_line_alpha = Override(default=0.3)
hover_fill_color = Override(default=None)
hover_fill_alpha = Override(default=0.4)
@property
def nodes(self) -> BoxNodes:
return BoxNodes(self)
[docs]
class Band(DataAnnotation):
''' Render a filled area band along a dimension.
See :ref:`ug_basic_annotations_bands` for information on plotting bands.
'''
# explicit __init__ to support Init signatures
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
lower = UnitsSpec(default=field("lower"), units_enum=CoordinateUnits, units_default="data", help="""
The coordinates of the lower portion of the filled area band.
""")
upper = UnitsSpec(default=field("upper"), units_enum=CoordinateUnits, units_default="data", help="""
The coordinates of the upper portion of the filled area band.
""")
base = UnitsSpec(default=field("base"), units_enum=CoordinateUnits, units_default="data", help="""
The orthogonal coordinates of the upper and lower values.
""")
dimension = Enum(Dimension, default='height', help="""
The direction of the band can be specified by setting this property
to "height" (``y`` direction) or "width" (``x`` direction).
""")
line_props = Include(ScalarLineProps, help="""
The {prop} values for the band.
""")
line_alpha = Override(default=0.3)
line_color = Override(default="#cccccc")
fill_props = Include(ScalarFillProps, help="""
The {prop} values for the band.
""")
fill_alpha = Override(default=0.4)
fill_color = Override(default="#fff9ba")
[docs]
class PolyAnnotation(Annotation):
''' Render a shaded polygonal region as an annotation.
See :ref:`ug_basic_annotations_polygon_annotations` for information on
plotting polygon annotations.
'''
# explicit __init__ to support Init signatures
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
xs = Seq(CoordinateLike, default=[], help="""
The x-coordinates of the region to draw.
""")
xs_units = Enum(CoordinateUnits, default='data', help="""
The unit type for the ``xs`` attribute. Interpreted as |data units| by
default.
""")
ys = Seq(CoordinateLike, default=[], help="""
The y-coordinates of the region to draw.
""")
ys_units = Enum(CoordinateUnits, default='data', help="""
The unit type for the ``ys`` attribute. Interpreted as |data units| by
default.
""")
editable = Bool(default=False, help="""
Allows to interactively modify the geometry of this polygon.
.. note::
This property is experimental and may change at any point.
""")
line_props = Include(ScalarLineProps, help="""
The {prop} values for the polygon.
""")
fill_props = Include(ScalarFillProps, help="""
The {prop} values for the polygon.
""")
hatch_props = Include(ScalarHatchProps, help="""
The {prop} values for the polygon.
""")
hover_line_props = Include(ScalarLineProps, prefix="hover", help="""
The {prop} values for the polygon when hovering over.
""")
hover_fill_props = Include(ScalarFillProps, prefix="hover", help="""
The {prop} values for the polygon when hovering over.
""")
hover_hatch_props = Include(ScalarHatchProps, prefix="hover", help="""
The {prop} values for the polygon when hovering over.
""")
line_color = Override(default="#cccccc")
line_alpha = Override(default=0.3)
fill_color = Override(default="#fff9ba")
fill_alpha = Override(default=0.4)
hover_line_color = Override(default=None)
hover_line_alpha = Override(default=0.3)
hover_fill_color = Override(default=None)
hover_fill_alpha = Override(default=0.4)
[docs]
class Slope(Annotation):
""" Render a sloped line as an annotation.
See :ref:`ug_basic_annotations_slope` for information on plotting slopes.
"""
# explicit __init__ to support Init signatures
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
gradient = Nullable(Float, help="""
The gradient of the line, in |data units|
""")
y_intercept = Nullable(Float, help="""
The y intercept of the line, in |data units|
""")
line_props = Include(ScalarLineProps, help="""
The {prop} values for the line.
""")
above_fill_props = Include(ScalarFillProps, prefix="above", help="""
The {prop} values for the area above the line.
""")
above_hatch_props = Include(ScalarHatchProps, prefix="above", help="""
The {prop} values for the area above the line.
""")
below_fill_props = Include(ScalarFillProps, prefix="below", help="""
The {prop} values for the area below the line.
""")
below_hatch_props = Include(ScalarHatchProps, prefix="below", help="""
The {prop} values for the area below the line.
""")
above_fill_color = Override(default=None)
above_fill_alpha = Override(default=0.4)
below_fill_color = Override(default=None)
below_fill_alpha = Override(default=0.4)
[docs]
class Span(Annotation):
""" Render a horizontal or vertical line span.
See :ref:`ug_basic_annotations_spans` for information on plotting spans.
"""
# explicit __init__ to support Init signatures
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
location = Nullable(CoordinateLike, help="""
The location of the span, along ``dimension``.
""")
location_units = Enum(CoordinateUnits, default='data', help="""
The unit type for the location attribute. Interpreted as "data space"
units by default.
""")
dimension = Enum(Dimension, default='width', help="""
The direction of the span can be specified by setting this property
to "height" (``y`` direction) or "width" (``x`` direction).
""")
editable = Bool(default=False, help="""
Allows to interactively modify the geometry of this span.
.. note::
This property is experimental and may change at any point.
""")
line_props = Include(ScalarLineProps, help="""
The {prop} values for the span.
""")
hover_line_props = Include(ScalarLineProps, prefix="hover", help="""
The {prop} values for the span when hovering over.
""")
hover_line_color = Override(default=None)
hover_line_alpha = Override(default=0.3)
[docs]
class Whisker(DataAnnotation):
''' Render a whisker along a dimension.
See :ref:`ug_basic_annotations_whiskers` for information on plotting whiskers.
'''
# explicit __init__ to support Init signatures
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
lower = UnitsSpec(default=field("lower"), units_enum=CoordinateUnits, units_default="data", help="""
The coordinates of the lower end of the whiskers.
""")
lower_head = Nullable(Instance(ArrowHead), default=InstanceDefault(TeeHead, size=10), help="""
Instance of ``ArrowHead``.
""")
upper = UnitsSpec(default=field("upper"), units_enum=CoordinateUnits, units_default="data", help="""
The coordinates of the upper end of the whiskers.
""")
upper_head = Nullable(Instance(ArrowHead), default=InstanceDefault(TeeHead, size=10), help="""
Instance of ``ArrowHead``.
""")
base = UnitsSpec(default=field("base"), units_enum=CoordinateUnits, units_default="data", help="""
The orthogonal coordinates of the upper and lower values.
""")
dimension = Enum(Dimension, default='height', help="""
The direction of the whisker can be specified by setting this property
to "height" (``y`` direction) or "width" (``x`` direction).
""")
line_props = Include(LineProps, help="""
The {prop} values for the whisker body.
""")
level = Override(default="underlay")
#-----------------------------------------------------------------------------
# Dev API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Private API
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------