from typing import Optional, List
from highcharts_core import constants
from highcharts_core.decorators import validate_types
from highcharts_core.options.series.base import SeriesBase
from highcharts_core.options.series.data.cartesian import (CartesianData,
Cartesian3DData,
CartesianDataCollection,
Cartesian3DDataCollection)
from highcharts_core.options.series.data.bar import (BarData,
BarDataCollection,
WaterfallData,
WaterfallDataCollection,
WindBarbData,
WindBarbDataCollection,
XRangeData,
XRangeDataCollection)
from highcharts_core.options.series.data.range import RangeData, RangeDataCollection
from highcharts_core.options.plot_options.bar import (BaseBarOptions,
BarOptions,
WaterfallOptions,
WindBarbOptions,
XRangeOptions)
from highcharts_core.utility_functions import mro__to_untrimmed_dict, is_ndarray
class BaseBarSeries(SeriesBase, BaseBarOptions):
"""Base class used for all bar/column series."""
def __init__(self, **kwargs):
super().__init__(**kwargs)
@classmethod
def _data_collection_class(cls):
"""Returns the class object used for the data collection.
:rtype: :class:`DataPointCollection <highcharts_core.options.series.data.collections.DataPointCollection>`
descendent
"""
return BarDataCollection
@classmethod
def _data_point_class(cls):
"""Returns the class object used for individual data points.
:rtype: :class:`DataBase <highcharts_core.options.series.data.base.DataBase>`
descendent
"""
return BarData
@property
def data(self) -> Optional[List[BarData] | BarDataCollection]:
"""Collection of data that represents the series. Defaults to
:obj:`None <python:None>`.
While the series type returns a collection of :class:`BarData` instances,
it accepts as input three different types of data:
.. tabs::
.. tab:: 1D Collection
.. code-block::
series = BarSeries()
series.data = [0, 5, 3, 5]
A one-dimensional collection of numerical values. Each member of the
collection will be interpreted as a ``y``-value, with its corresponding ``x``
value automatically determined.
If :meth:`BarSeries.point_start` is :obj:`None <python:None>`, ``x`` values
will begin at ``0``. Otherwise, they will start at ``point_start``.
If :meth:`BarSeries.point_interval` is :obj:`None <python:None>`, ``x``
values will be incremented by ``1``. Otherwise, they will be incremented
by the value of ``point_interval``.
.. tab:: 2D Collection
.. code-block::
series = BarSeries()
# Category X-axis
series.data = [
['Category A', 0],
['Category B', 5],
['Category C', 3],
['Category D', 5]
]
# Numerical X-axis
series.data = [
[9, 0],
[1, 5],
[2, 3],
[7, 5]
]
A two-dimensional collection of values. Each member of the collection will be
interpreted as an ``x`` and ``y`` pair. The ``x`` value can be a
:class:`str <python:str>`, :class:`date <python:datetime.date>`,
:class:`datetime <python:datetime.datetime>`, or numeric value.
.. note::
If the ``x`` value is a :class:`str <python:str>`, it will be interpreted
as the name of the data point.
.. tab:: Object Collection
A one-dimensional collection of :class:`BarData` objects.
:rtype: :class:`list <python:list>` of :class:`BarData` or
:class:`BarDataCollection`
:obj:`None <python:None>`
"""
return self._data
@data.setter
def data(self, value):
if not is_ndarray(value) and not value:
self._data = None
else:
self._data = BarData.from_array(value)
@classmethod
def _get_kwargs_from_dict(cls, as_dict):
kwargs = {
'accessibility': as_dict.get('accessibility', None),
'allow_point_select': as_dict.get('allowPointSelect', None),
'animation': as_dict.get('animation', None),
'class_name': as_dict.get('className', None),
'clip': as_dict.get('clip', None),
'color': as_dict.get('color', None),
'cursor': as_dict.get('cursor', None),
'custom': as_dict.get('custom', None),
'dash_style': as_dict.get('dashStyle', None),
'data_labels': as_dict.get('dataLabels', None),
'description': as_dict.get('description', None),
'enable_mouse_tracking': as_dict.get('enableMouseTracking', None),
'events': as_dict.get('events', None),
'include_in_data_export': as_dict.get('includeInDataExport', None),
'keys': as_dict.get('keys', None),
'label': as_dict.get('label', None),
'legend_symbol': as_dict.get('legendSymbol', None),
'linked_to': as_dict.get('linkedTo', None),
'marker': as_dict.get('marker', None),
'on_point': as_dict.get('onPoint', None),
'opacity': as_dict.get('opacity', None),
'point': as_dict.get('point', None),
'point_description_formatter': as_dict.get('pointDescriptionFormatter', None),
'selected': as_dict.get('selected', None),
'show_checkbox': as_dict.get('showCheckbox', None),
'show_in_legend': as_dict.get('showInLegend', None),
'skip_keyboard_navigation': as_dict.get('skipKeyboardNavigation', None),
'sonification': as_dict.get('sonification', None),
'states': as_dict.get('states', None),
'sticky_tracking': as_dict.get('stickyTracking', None),
'threshold': as_dict.get('threshold', None),
'tooltip': as_dict.get('tooltip', None),
'turbo_threshold': as_dict.get('turboThreshold', None),
'visible': as_dict.get('visible', None),
'animation_limit': as_dict.get('animationLimit', None),
'boost_blending': as_dict.get('boostBlending', None),
'boost_threshold': as_dict.get('boostThreshold', None),
'color_axis': as_dict.get('colorAxis', None),
'color_index': as_dict.get('colorIndex', None),
'color_key': as_dict.get('colorKey', None),
'connect_ends': as_dict.get('connectEnds', None),
'connect_nulls': as_dict.get('connectNulls', None),
'crisp': as_dict.get('crisp', None),
'crop_threshold': as_dict.get('cropThreshold', None),
'data_sorting': as_dict.get('dataSorting', None),
'drag_drop': as_dict.get('dragDrop', None),
'fill_color': as_dict.get('fillColor', None),
'fill_opacity': as_dict.get('fillOpacity', None),
'find_nearest_point_by': as_dict.get('findNearestPointBy', None),
'get_extremes_from_all': as_dict.get('getExtremesFromAll', None),
'inactive_other_points': as_dict.get('inactiveOtherPoints', None),
'linecap': as_dict.get('linecap', None),
'line_color': as_dict.get('lineColor', None),
'line_width': as_dict.get('lineWidth', None),
'negative_color': as_dict.get('negativeColor', None),
'negative_fill_color': as_dict.get('negativeFillColor', None),
'point_interval': as_dict.get('pointInterval', None),
'point_interval_unit': as_dict.get('pointIntervalUnit', None),
'point_placement': as_dict.get('pointPlacement', None),
'point_start': as_dict.get('pointStart', None),
'relative_x_value': as_dict.get('relativeXValue', None),
'shadow': as_dict.get('shadow', None),
'soft_threshold': as_dict.get('softThreshold', None),
'stacking': as_dict.get('stacking', None),
'step': as_dict.get('step', None),
'track_by_area': as_dict.get('trackByArea', None),
'zone_axis': as_dict.get('zoneAxis', None),
'zones': as_dict.get('zones', None),
'border_color': as_dict.get('borderColor', None),
'border_radius': as_dict.get('borderRadius', None),
'border_width': as_dict.get('borderWidth', None),
'center_in_category': as_dict.get('centerInCategory', None),
'color_by_point': as_dict.get('colorByPoint', None),
'colors': as_dict.get('colors', None),
'grouping': as_dict.get('grouping', None),
'group_padding': as_dict.get('groupPadding', None),
'max_point_width': as_dict.get('maxPointWidth', None),
'min_point_length': as_dict.get('minPointLength', None),
'point_padding': as_dict.get('pointPadding', None),
'point_range': as_dict.get('pointRange', None),
'point_width': as_dict.get('pointWidth', None),
'data': as_dict.get('data', None),
'id': as_dict.get('id', None),
'index': as_dict.get('index', None),
'legend_index': as_dict.get('legendIndex', None),
'name': as_dict.get('name', None),
'stack': as_dict.get('stack', None),
'x_axis': as_dict.get('xAxis', None),
'y_axis': as_dict.get('yAxis', None),
'z_index': as_dict.get('zIndex', None),
}
return kwargs
def _to_untrimmed_dict(self, in_cls = None) -> dict:
untrimmed = mro__to_untrimmed_dict(self, in_cls = in_cls)
return untrimmed
[docs]class BarSeries(BaseBarSeries, BarOptions):
"""Options to apply to a Bar series.
.. note::
A bar series is a special type of column series where the columns are horizontal.
.. figure:: ../../../_static/bar-example.png
:alt: Bar Example Chart
:align: center
"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
@classmethod
def _get_kwargs_from_dict(cls, as_dict):
kwargs = {
'accessibility': as_dict.get('accessibility', None),
'allow_point_select': as_dict.get('allowPointSelect', None),
'animation': as_dict.get('animation', None),
'class_name': as_dict.get('className', None),
'clip': as_dict.get('clip', None),
'color': as_dict.get('color', None),
'cursor': as_dict.get('cursor', None),
'custom': as_dict.get('custom', None),
'dash_style': as_dict.get('dashStyle', None),
'data_labels': as_dict.get('dataLabels', None),
'description': as_dict.get('description', None),
'enable_mouse_tracking': as_dict.get('enableMouseTracking', None),
'events': as_dict.get('events', None),
'include_in_data_export': as_dict.get('includeInDataExport', None),
'keys': as_dict.get('keys', None),
'label': as_dict.get('label', None),
'legend_symbol': as_dict.get('legendSymbol', None),
'linked_to': as_dict.get('linkedTo', None),
'marker': as_dict.get('marker', None),
'on_point': as_dict.get('onPoint', None),
'opacity': as_dict.get('opacity', None),
'point': as_dict.get('point', None),
'point_description_formatter': as_dict.get('pointDescriptionFormatter', None),
'selected': as_dict.get('selected', None),
'show_checkbox': as_dict.get('showCheckbox', None),
'show_in_legend': as_dict.get('showInLegend', None),
'skip_keyboard_navigation': as_dict.get('skipKeyboardNavigation', None),
'sonification': as_dict.get('sonification', None),
'states': as_dict.get('states', None),
'sticky_tracking': as_dict.get('stickyTracking', None),
'threshold': as_dict.get('threshold', None),
'tooltip': as_dict.get('tooltip', None),
'turbo_threshold': as_dict.get('turboThreshold', None),
'visible': as_dict.get('visible', None),
'animation_limit': as_dict.get('animationLimit', None),
'boost_blending': as_dict.get('boostBlending', None),
'boost_threshold': as_dict.get('boostThreshold', None),
'color_axis': as_dict.get('colorAxis', None),
'color_index': as_dict.get('colorIndex', None),
'color_key': as_dict.get('colorKey', None),
'connect_ends': as_dict.get('connectEnds', None),
'connect_nulls': as_dict.get('connectNulls', None),
'crisp': as_dict.get('crisp', None),
'crop_threshold': as_dict.get('cropThreshold', None),
'data_sorting': as_dict.get('dataSorting', None),
'drag_drop': as_dict.get('dragDrop', None),
'fill_color': as_dict.get('fillColor', None),
'fill_opacity': as_dict.get('fillOpacity', None),
'find_nearest_point_by': as_dict.get('findNearestPointBy', None),
'get_extremes_from_all': as_dict.get('getExtremesFromAll', None),
'inactive_other_points': as_dict.get('inactiveOtherPoints', None),
'linecap': as_dict.get('linecap', None),
'line_color': as_dict.get('lineColor', None),
'line_width': as_dict.get('lineWidth', None),
'negative_color': as_dict.get('negativeColor', None),
'negative_fill_color': as_dict.get('negativeFillColor', None),
'point_interval': as_dict.get('pointInterval', None),
'point_interval_unit': as_dict.get('pointIntervalUnit', None),
'point_placement': as_dict.get('pointPlacement', None),
'point_start': as_dict.get('pointStart', None),
'relative_x_value': as_dict.get('relativeXValue', None),
'shadow': as_dict.get('shadow', None),
'soft_threshold': as_dict.get('softThreshold', None),
'stacking': as_dict.get('stacking', None),
'step': as_dict.get('step', None),
'track_by_area': as_dict.get('trackByArea', None),
'zone_axis': as_dict.get('zoneAxis', None),
'zones': as_dict.get('zones', None),
'border_color': as_dict.get('borderColor', None),
'border_radius': as_dict.get('borderRadius', None),
'border_width': as_dict.get('borderWidth', None),
'center_in_category': as_dict.get('centerInCategory', None),
'color_by_point': as_dict.get('colorByPoint', None),
'colors': as_dict.get('colors', None),
'grouping': as_dict.get('grouping', None),
'group_padding': as_dict.get('groupPadding', None),
'max_point_width': as_dict.get('maxPointWidth', None),
'min_point_length': as_dict.get('minPointLength', None),
'point_padding': as_dict.get('pointPadding', None),
'point_range': as_dict.get('pointRange', None),
'point_width': as_dict.get('pointWidth', None),
'depth': as_dict.get('depth', None),
'edge_color': as_dict.get('edgeColor', None),
'edge_width': as_dict.get('edgeWidth', None),
'group_z_padding': as_dict.get('groupZPadding', None),
'data': as_dict.get('data', None),
'id': as_dict.get('id', None),
'index': as_dict.get('index', None),
'legend_index': as_dict.get('legendIndex', None),
'name': as_dict.get('name', None),
'stack': as_dict.get('stack', None),
'x_axis': as_dict.get('xAxis', None),
'y_axis': as_dict.get('yAxis', None),
'z_index': as_dict.get('zIndex', None),
}
return kwargs
def _to_untrimmed_dict(self, in_cls = None) -> dict:
untrimmed = mro__to_untrimmed_dict(self, in_cls = in_cls)
return untrimmed
[docs]class ColumnSeries(BarSeries):
"""Options to apply to a Column series types.
Column series display one column per value along an X axis.
.. figure:: ../../../_static/column-example.png
:alt: Column Example Chart
:align: center
"""
pass
[docs]class ColumnPyramidSeries(ColumnSeries):
"""Options to apply to a Column Pyramid series.
Column Pyramid series display one pyramid per value along an X axis.
.. hint::
To display horizontal pyramids, set :meth:`Chart.inverted` to ``True``.
.. tabs::
.. tab:: Standard
.. figure:: ../../../_static/columnpyramid-example.png
:alt: ColumnPyramid Example Chart
:align: center
.. tab:: Stacked
.. figure:: ../../../_static/columnpyramid-example-stacked.png
:alt: Stacked Column Pyramid Example Chart
:align: center
.. tab:: Stacked + Inverted
.. figure:: ../../../_static/columnpyramid-example-stacked-horizontal.png
:alt: Stacked and Inverted Column Pyramid Example Chart
:align: center
"""
@classmethod
def _data_collection_class(cls):
"""Returns the class object used for the data collection.
:rtype: :class:`DataPointCollection <highcharts_core.options.series.data.collections.DataPointCollection>`
descendent
"""
return CartesianDataCollection
@classmethod
def _data_point_class(cls):
"""Returns the class object used for individual data points.
:rtype: :class:`DataBase <highcharts_core.options.series.data.base.DataBase>`
descendent
"""
return CartesianData
@property
def data(self) -> Optional[List[CartesianData] | CartesianDataCollection]:
"""Collection of data that represents the series. Defaults to
:obj:`None <python:None>`.
While the series type returns a collection of :class:`CartesianData` instances,
it accepts as input three different types of data:
.. tabs::
.. tab:: 1D Collection
.. code-block::
area_series = AreaSeries()
area_series.data = [0, 5, 3, 5]
A one-dimensional collection of numerical values. Each member of the
collection will be interpreted as a ``y``-value, with its corresponding ``x``
value automatically determined.
If :meth:`AreaSeries.point_start` is :obj:`None <python:None>`, ``x`` values
will begin at ``0``. Otherwise, they will start at ``point_start``.
If :meth:`AreaSeries.point_interval` is :obj:`None <python:None>`, ``x``
values will be incremented by ``1``. Otherwise, they will be incremented
by the value of ``point_interval``.
.. tab:: 2D Collection
.. code-block::
area_series = AreaSeries()
# Category X-axis
area_series.data = [
['Category A', 0],
['Category B', 5],
['Category C', 3],
['Category D', 5]
]
# Numerical X-axis
area_series.data = [
[9, 0],
[1, 5],
[2, 3],
[7, 5]
]
A two-dimensional collection of values. Each member of the collection will be
interpreted as an ``x`` and ``y`` pair. The ``x`` value can be a
:class:`str <python:str>`, :class:`date <python:datetime.date>`,
:class:`datetime <python:datetime.datetime>`, or numeric value.
.. note::
If the ``x`` value is a :class:`str <python:str>`, it will be interpreted
as the name of the data point.
.. tab:: Object Collection
A one-dimensional collection of :class:`CartesianData` objects.
:rtype: :class:`list <python:list>` of :class:`CartesianData` or
:class:`CartesianDataCollection` or
:obj:`None <python:None>`
"""
return self._data
@data.setter
def data(self, value):
if not is_ndarray(value) and not value:
self._data = None
else:
self._data = CartesianData.from_array(value)
[docs]class ColumnRangeSeries(ColumnSeries):
"""Options to apply to a Column Range series.
The column range is a cartesian series type with higher and lower Y values along
an X axis.
.. hint::
To display horizontal bars, set :meth:`Chart.inverted` to ``True``.
.. tabs::
.. tab:: Standard
.. figure:: ../../../_static/columnrange-example.png
:alt: ColumnRange Example Chart
:align: center
.. tab:: Horizontal
.. figure:: ../../../_static/columnrange-example-horizontal.png
:alt: Inverted Column Range Example Chart
:align: center
"""
@classmethod
def _data_collection_class(cls):
"""Returns the class object used for the data collection.
:rtype: :class:`DataPointCollection <highcharts_core.options.series.data.collections.DataPointCollection>`
descendent
"""
return RangeDataCollection
@classmethod
def _data_point_class(cls):
"""Returns the class object used for individual data points.
:rtype: :class:`DataBase <highcharts_core.options.series.data.base.DataBase>`
descendent
"""
return RangeData
@property
def data(self) -> Optional[List[RangeData] | RangeDataCollection]:
"""Collection of data that represents the series. Defaults to
:obj:`None <python:None>`.
While the series type returns a collection of :class:`RangeData` instances,
it accepts as input three different types of data:
.. tabs::
.. tab:: 1D Collection
.. code-block::
area_series = AreaSeries()
area_series.data = [0, 5, 3, 5]
A one-dimensional collection of numerical values. Each member of the
collection will be interpreted as a ``y``-value, with its corresponding ``x``
value automatically determined.
If :meth:`AreaSeries.point_start` is :obj:`None <python:None>`, ``x`` values
will begin at ``0``. Otherwise, they will start at ``point_start``.
If :meth:`AreaSeries.point_interval` is :obj:`None <python:None>`, ``x``
values will be incremented by ``1``. Otherwise, they will be incremented
by the value of ``point_interval``.
.. tab:: 2D Collection
.. code-block::
area_series = AreaSeries()
# Category X-axis
area_series.data = [
['Category A', 0],
['Category B', 5],
['Category C', 3],
['Category D', 5]
]
# Numerical X-axis
area_series.data = [
[9, 0],
[1, 5],
[2, 3],
[7, 5]
]
A two-dimensional collection of values. Each member of the collection will be
interpreted as an ``x`` and ``y`` pair. The ``x`` value can be a
:class:`str <python:str>`, :class:`date <python:datetime.date>`,
:class:`datetime <python:datetime.datetime>`, or numeric value.
.. note::
If the ``x`` value is a :class:`str <python:str>`, it will be interpreted
as the name of the data point.
.. tab:: Object Collection
A one-dimensional collection of :class:`RangeData` objects.
:rtype: :class:`list <python:list>` of :class:`RangeData` or
:class:`RangeDataCollection` or
:obj:`None <python:None>`
"""
return self._data
@data.setter
def data(self, value):
if not is_ndarray(value) and not value:
self._data = None
else:
self._data = RangeData.from_array(value)
[docs]class CylinderSeries(BarSeries):
"""Options to apply to a Cylinder series.
A cylinder graph is a variation of a 3d column graph. The cylinder graph features
cylindrical points.
.. figure:: ../../../_static/cylinder-example.png
:alt: Cylinder Example Chart
:align: center
"""
pass
[docs]class VariwideSeries(BaseBarSeries):
"""Options to apply to a Variwide series.
A variwide chart (related to marimekko chart) is a column chart with a variable
width expressing a third dimension.
.. tabs::
.. tab:: Standard Variwide
.. figure:: ../../../_static/variwide-example.png
:alt: Variwide Example Chart
:align: center
.. tab:: Inverted Variwide
.. figure:: ../../../_static/variwide-example-inverted.png
:alt: Variwide Example Chart
:align: center
.. tab:: with Datetime Axis
.. figure:: ../../../_static/variwide-example-datetime.png
:alt: Variwide Example Chart
:align: center
"""
@classmethod
def _data_collection_class(cls):
"""Returns the class object used for the data collection.
:rtype: :class:`DataPointCollection <highcharts_core.options.series.data.collections.DataPointCollection>`
descendent
"""
return Cartesian3DDataCollection
@classmethod
def _data_point_class(cls):
"""Returns the class object used for individual data points.
:rtype: :class:`DataBase <highcharts_core.options.series.data.base.DataBase>`
descendent
"""
return Cartesian3DData
@property
def data(self) -> Optional[List[Cartesian3DData] | Cartesian3DDataCollection]:
"""Collection of data that represents the series. Defaults to
:obj:`None <python:None>`.
While the series type returns a collection of :class:`Cartesian3DData` instances,
it accepts as input three different types of data:
.. tabs::
.. tab:: 2D Collection
.. code-block::
series = VariwideSeries()
series.data = [
[0, 2],
[5, 1],
[3, 7],
[5, 1]
]
A two-dimensional collection of numerical values, where the dimensions
correspond to the ``y`` and ``z`` values, respectively. This structure
automatically infers the ``x`` value, such that if
:meth:`VariwideSeries.point_start` is :obj:`None <python:None>`, ``x`` values
will begin at ``0``. Otherwise, they will start at ``point_start``.
If :meth:`VariwideSeries.point_interval` is :obj:`None <python:None>`, ``x``
values will be incremented by ``1``. Otherwise, they will be incremented
by the value of ``point_interval``.
.. tab:: 3D Collection
.. code-block::
series = VariwideSeries()
# Category X-axis
series.data = [
['Category A', 0, 2],
['Category B', 5, 1],
['Category C', 3, 7],
['Category D', 5, 1]
]
# Numerical X-axis
series.data = [
[9, 0, 2],
[1, 5, 1],
[2, 3, 7],
[7, 5, 1]
]
A three-dimensional collection of values. Each member of the collection will
be interpreted as an ``x``, ``y``, and ``z`` value respectively. The ``x``
value can be a :class:`str <python:str>`,
:class:`date <python:datetime.date>`,
:class:`datetime <python:datetime.datetime>`, or numeric value.
.. note::
If the ``x`` value is a :class:`str <python:str>`, it will be interpreted
as the name of the data point.
.. tab:: Object Collection
A one-dimensional collection of :class:`Cartesian3DData` objects.
:rtype: :class:`list <python:list>` of :class:`Cartesian3DData` or
:class:`Cartesian3DDataCollection` or
:obj:`None <python:None>`
"""
return self._data
@data.setter
def data(self, value):
if not is_ndarray(value) and not value:
self._data = None
else:
self._data = Cartesian3DData.from_array(value)
[docs]class WaterfallSeries(ColumnSeries, WaterfallOptions):
"""Options to apply to a Waterfall series.
A waterfall chart displays sequentially introduced positive or negative values in
cumulative columns.
.. tabs::
.. tab:: Standard Waterfall
.. figure:: ../../../_static/waterfall-example.png
:alt: Waterfall Example Chart
:align: center
.. tab:: Horizontal (Inverted) Waterfall
.. figure:: ../../../_static/waterfall-example-inverted.png
:alt: Waterfall Example Chart
:align: center
.. tab:: Stacked Waterfall
.. figure:: ../../../_static/waterfall-example-stacked.png
:alt: Waterfall Example Chart
:align: center
"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
@classmethod
def _data_collection_class(cls):
"""Returns the class object used for the data collection.
:rtype: :class:`DataPointCollection <highcharts_core.options.series.data.collections.DataPointCollection>`
descendent
"""
return WaterfallDataCollection
@classmethod
def _data_point_class(cls):
"""Returns the class object used for individual data points.
:rtype: :class:`DataBase <highcharts_core.options.series.data.base.DataBase>`
descendent
"""
return WaterfallData
@property
def data(self) -> Optional[List[WaterfallData] | WaterfallDataCollection]:
"""Collection of data that represents the series. Defaults to
:obj:`None <python:None>`.
While the series type returns a collection of :class:`WaterfallData` instances,
it accepts as input three different types of data:
.. tabs::
.. tab:: 1D Collection
.. code-block::
series = WaterfallSeries()
series.data = [0, 5, 3, 5]
A one-dimensional collection of numerical values. Each member of the
collection will be interpreted as a ``y``-value, with its corresponding ``x``
value automatically determined.
If :meth:`WaterfallSeries.point_start` is :obj:`None <python:None>`, ``x``
values will begin at ``0``. Otherwise, they will start at ``point_start``.
If :meth:`WaterfallSeries.point_interval` is :obj:`None <python:None>`, ``x``
values will be incremented by ``1``. Otherwise, they will be incremented
by the value of ``point_interval``.
.. tab:: 2D Collection
.. code-block::
series = WaterfallSeries()
# Category X-axis
series.data = [
['Category A', 0],
['Category B', 5],
['Category C', 3],
['Category D', 5]
]
# Numerical X-axis
series.data = [
[9, 0],
[1, 5],
[2, 3],
[7, 5]
]
A two-dimensional collection of values. Each member of the collection will be
interpreted as an ``x`` and ``y`` pair. The ``x`` value can be a
:class:`str <python:str>`, :class:`date <python:datetime.date>`,
:class:`datetime <python:datetime.datetime>`, or numeric value.
.. note::
If the ``x`` value is a :class:`str <python:str>`, it will be interpreted
as the name of the data point.
.. tab:: Object Collection
A one-dimensional collection of :class:`WaterfallData` objects.
:rtype: :class:`list <python:list>` of :class:`WaterfallData` or
:class:`WaterfallDataCollection` or
:obj:`None <python:None>`
"""
return self._data
@data.setter
def data(self, value):
if not is_ndarray(value) and not value:
self._data = None
else:
self._data = WaterfallData.from_array(value)
@classmethod
def _get_kwargs_from_dict(cls, as_dict):
kwargs = {
'accessibility': as_dict.get('accessibility', None),
'allow_point_select': as_dict.get('allowPointSelect', None),
'animation': as_dict.get('animation', None),
'class_name': as_dict.get('className', None),
'clip': as_dict.get('clip', None),
'color': as_dict.get('color', None),
'cursor': as_dict.get('cursor', None),
'custom': as_dict.get('custom', None),
'dash_style': as_dict.get('dashStyle', None),
'data_labels': as_dict.get('dataLabels', None),
'description': as_dict.get('description', None),
'enable_mouse_tracking': as_dict.get('enableMouseTracking', None),
'events': as_dict.get('events', None),
'include_in_data_export': as_dict.get('includeInDataExport', None),
'keys': as_dict.get('keys', None),
'label': as_dict.get('label', None),
'legend_symbol': as_dict.get('legendSymbol', None),
'linked_to': as_dict.get('linkedTo', None),
'marker': as_dict.get('marker', None),
'on_point': as_dict.get('onPoint', None),
'opacity': as_dict.get('opacity', None),
'point': as_dict.get('point', None),
'point_description_formatter': as_dict.get('pointDescriptionFormatter', None),
'selected': as_dict.get('selected', None),
'show_checkbox': as_dict.get('showCheckbox', None),
'show_in_legend': as_dict.get('showInLegend', None),
'skip_keyboard_navigation': as_dict.get('skipKeyboardNavigation', None),
'sonification': as_dict.get('sonification', None),
'states': as_dict.get('states', None),
'sticky_tracking': as_dict.get('stickyTracking', None),
'threshold': as_dict.get('threshold', None),
'tooltip': as_dict.get('tooltip', None),
'turbo_threshold': as_dict.get('turboThreshold', None),
'visible': as_dict.get('visible', None),
'animation_limit': as_dict.get('animationLimit', None),
'boost_blending': as_dict.get('boostBlending', None),
'boost_threshold': as_dict.get('boostThreshold', None),
'color_axis': as_dict.get('colorAxis', None),
'color_index': as_dict.get('colorIndex', None),
'color_key': as_dict.get('colorKey', None),
'connect_ends': as_dict.get('connectEnds', None),
'connect_nulls': as_dict.get('connectNulls', None),
'crisp': as_dict.get('crisp', None),
'crop_threshold': as_dict.get('cropThreshold', None),
'data_sorting': as_dict.get('dataSorting', None),
'drag_drop': as_dict.get('dragDrop', None),
'fill_color': as_dict.get('fillColor', None),
'fill_opacity': as_dict.get('fillOpacity', None),
'find_nearest_point_by': as_dict.get('findNearestPointBy', None),
'get_extremes_from_all': as_dict.get('getExtremesFromAll', None),
'inactive_other_points': as_dict.get('inactiveOtherPoints', None),
'linecap': as_dict.get('linecap', None),
'line_color': as_dict.get('lineColor', None),
'line_width': as_dict.get('lineWidth', None),
'negative_color': as_dict.get('negativeColor', None),
'negative_fill_color': as_dict.get('negativeFillColor', None),
'point_interval': as_dict.get('pointInterval', None),
'point_interval_unit': as_dict.get('pointIntervalUnit', None),
'point_placement': as_dict.get('pointPlacement', None),
'point_start': as_dict.get('pointStart', None),
'relative_x_value': as_dict.get('relativeXValue', None),
'shadow': as_dict.get('shadow', None),
'soft_threshold': as_dict.get('softThreshold', None),
'stacking': as_dict.get('stacking', None),
'step': as_dict.get('step', None),
'track_by_area': as_dict.get('trackByArea', None),
'zone_axis': as_dict.get('zoneAxis', None),
'zones': as_dict.get('zones', None),
'border_color': as_dict.get('borderColor', None),
'border_radius': as_dict.get('borderRadius', None),
'border_width': as_dict.get('borderWidth', None),
'center_in_category': as_dict.get('centerInCategory', None),
'color_by_point': as_dict.get('colorByPoint', None),
'colors': as_dict.get('colors', None),
'grouping': as_dict.get('grouping', None),
'group_padding': as_dict.get('groupPadding', None),
'max_point_width': as_dict.get('maxPointWidth', None),
'min_point_length': as_dict.get('minPointLength', None),
'point_padding': as_dict.get('pointPadding', None),
'point_range': as_dict.get('pointRange', None),
'point_width': as_dict.get('pointWidth', None),
'depth': as_dict.get('depth', None),
'edge_color': as_dict.get('edgeColor', None),
'edge_width': as_dict.get('edgeWidth', None),
'group_z_padding': as_dict.get('groupZPadding', None),
'up_color': as_dict.get('upColor', None),
'data': as_dict.get('data', None),
'id': as_dict.get('id', None),
'index': as_dict.get('index', None),
'legend_index': as_dict.get('legendIndex', None),
'name': as_dict.get('name', None),
'stack': as_dict.get('stack', None),
'x_axis': as_dict.get('xAxis', None),
'y_axis': as_dict.get('yAxis', None),
'z_index': as_dict.get('zIndex', None),
}
return kwargs
def _to_untrimmed_dict(self, in_cls = None) -> dict:
untrimmed = mro__to_untrimmed_dict(self, in_cls = in_cls)
return untrimmed
[docs]class WindBarbSeries(BarSeries, WindBarbOptions):
"""Options to apply to a Wind Barb series.
Wind barbs are a convenient way to represent wind speed and direction in one
graphical form. Wind direction is given by the stem direction, and wind speed by
the number and shape of barbs.
.. figure:: ../../../_static/windbarb-example.png
:alt: Wind Barb Example Chart
:align: center
"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
@classmethod
def _data_collection_class(cls):
"""Returns the class object used for the data collection.
:rtype: :class:`DataPointCollection <highcharts_core.options.series.data.collections.DataPointCollection>`
descendent
"""
return WindBarbDataCollection
@classmethod
def _data_point_class(cls):
"""Returns the class object used for individual data points.
:rtype: :class:`DataBase <highcharts_core.options.series.data.base.DataBase>`
descendent
"""
return WindBarbData
@property
def data(self) -> Optional[List[WindBarbData] | WindBarbDataCollection]:
"""Collection of data that represents the series. Defaults to
:obj:`None <python:None>`.
While the series type returns a collection of :class:`WindBarbData` instances,
it accepts as input three different types of data:
.. tabs::
.. tab:: 3D Collection
.. code-block::
series = WindBarbSeries()
series.data = [
['2022-01-01T00:00:00', 3.3, 90],
['2022-01-01T01:00:00', 12.1, 180],
['2022-01-01T02:00:00', 11.1, 270]
]
A three-dimensional collection of numerical values, where the dimensions
correspond to the :meth:`x <WindBarbData.x>`,
:meth:`value <WindBarbData.value>`, and
:meth:`direction <WindBarbData.direction>` values, respectively.
.. warning::
This structure assumes the chart is primarily intended to provide windspeed
data, and does not feature a separate ``y`` value (``y`` will default to
:obj:`None <python:None>`).
.. note::
The ``x`` value can be a :class:`str <python:str>`,
:class:`date <python:datetime.date>`,
:class:`datetime <python:datetime.datetime>`, or numeric value.
.. tab:: 4D Collection
.. code-block::
series = WindBarbSeries()
series.data = [
['2022-01-01T00:00:00', 3.3, 90, 123],
['2022-01-01T01:00:00', 12.1, 180, 456],
['2022-01-01T02:00:00', 11.1, 270, 789]
]
A four-dimensional collection of values, , where the dimensions
correspond to the :meth:`x <WindBarbData.x>`,
:meth:`value <WindBarbData.value>`,
:meth:`direction <WindBarbData.direction>`, and
:meth:`y <WindBarbData.y>` values, respectively.
.. note::
The ``x`` value can be a :class:`str <python:str>`,
:class:`date <python:datetime.date>`,
:class:`datetime <python:datetime.datetime>`, or numeric value.
.. tab:: Object Collection
A one-dimensional collection of :class:`WindBarbData` objects.
:rtype: :class:`list <python:list>` of :class:`WindBarbData` or
:class:`WindBarbDataCollection` or
:obj:`None <python:None>`
"""
return self._data
@data.setter
def data(self, value):
if not is_ndarray(value) and not value:
self._data = None
else:
self._data = WindBarbData.from_array(value)
@classmethod
def _get_kwargs_from_dict(cls, as_dict):
kwargs = {
'accessibility': as_dict.get('accessibility', None),
'allow_point_select': as_dict.get('allowPointSelect', None),
'animation': as_dict.get('animation', None),
'class_name': as_dict.get('className', None),
'clip': as_dict.get('clip', None),
'color': as_dict.get('color', None),
'cursor': as_dict.get('cursor', None),
'custom': as_dict.get('custom', None),
'dash_style': as_dict.get('dashStyle', None),
'data_labels': as_dict.get('dataLabels', None),
'description': as_dict.get('description', None),
'enable_mouse_tracking': as_dict.get('enableMouseTracking', None),
'events': as_dict.get('events', None),
'include_in_data_export': as_dict.get('includeInDataExport', None),
'keys': as_dict.get('keys', None),
'label': as_dict.get('label', None),
'legend_symbol': as_dict.get('legendSymbol', None),
'linked_to': as_dict.get('linkedTo', None),
'marker': as_dict.get('marker', None),
'on_point': as_dict.get('onPoint', None),
'opacity': as_dict.get('opacity', None),
'point': as_dict.get('point', None),
'point_description_formatter': as_dict.get('pointDescriptionFormatter', None),
'selected': as_dict.get('selected', None),
'show_checkbox': as_dict.get('showCheckbox', None),
'show_in_legend': as_dict.get('showInLegend', None),
'skip_keyboard_navigation': as_dict.get('skipKeyboardNavigation', None),
'sonification': as_dict.get('sonification', None),
'states': as_dict.get('states', None),
'sticky_tracking': as_dict.get('stickyTracking', None),
'threshold': as_dict.get('threshold', None),
'tooltip': as_dict.get('tooltip', None),
'turbo_threshold': as_dict.get('turboThreshold', None),
'visible': as_dict.get('visible', None),
'animation_limit': as_dict.get('animationLimit', None),
'boost_blending': as_dict.get('boostBlending', None),
'boost_threshold': as_dict.get('boostThreshold', None),
'color_axis': as_dict.get('colorAxis', None),
'color_index': as_dict.get('colorIndex', None),
'color_key': as_dict.get('colorKey', None),
'connect_ends': as_dict.get('connectEnds', None),
'connect_nulls': as_dict.get('connectNulls', None),
'crisp': as_dict.get('crisp', None),
'crop_threshold': as_dict.get('cropThreshold', None),
'data_sorting': as_dict.get('dataSorting', None),
'drag_drop': as_dict.get('dragDrop', None),
'find_nearest_point_by': as_dict.get('findNearestPointBy', None),
'get_extremes_from_all': as_dict.get('getExtremesFromAll', None),
'inactive_other_points': as_dict.get('inactiveOtherPoints', None),
'linecap': as_dict.get('linecap', None),
'line_width': as_dict.get('lineWidth', None),
'negative_color': as_dict.get('negativeColor', None),
'point_description_format': as_dict.get('pointDescriptionFormat', None),
'point_interval': as_dict.get('pointInterval', None),
'point_interval_unit': as_dict.get('pointIntervalUnit', None),
'point_placement': as_dict.get('pointPlacement', None),
'point_start': as_dict.get('pointStart', None),
'relative_x_value': as_dict.get('relativeXValue', None),
'shadow': as_dict.get('shadow', None),
'soft_threshold': as_dict.get('softThreshold', None),
'stacking': as_dict.get('stacking', None),
'step': as_dict.get('step', None),
'zone_axis': as_dict.get('zoneAxis', None),
'zones': as_dict.get('zones', None),
'border_color': as_dict.get('borderColor', None),
'border_radius': as_dict.get('borderRadius', None),
'border_width': as_dict.get('borderWidth', None),
'center_in_category': as_dict.get('centerInCategory', None),
'color_by_point': as_dict.get('colorByPoint', None),
'colors': as_dict.get('colors', None),
'grouping': as_dict.get('grouping', None),
'group_padding': as_dict.get('groupPadding', None),
'max_point_width': as_dict.get('maxPointWidth', None),
'min_point_length': as_dict.get('minPointLength', None),
'point_padding': as_dict.get('pointPadding', None),
'point_range': as_dict.get('pointRange', None),
'point_width': as_dict.get('pointWidth', None),
'depth': as_dict.get('depth', None),
'edge_color': as_dict.get('edgeColor', None),
'edge_width': as_dict.get('edgeWidth', None),
'group_z_padding': as_dict.get('groupZPadding', None),
'data_grouping': as_dict.get('dataGrouping', None),
'on_series': as_dict.get('onSeries', None),
'vector_length': as_dict.get('vectorLength', None),
'x_offset': as_dict.get('xOffset', None),
'y_offset': as_dict.get('yOffset', None),
'data': as_dict.get('data', None),
'id': as_dict.get('id', None),
'index': as_dict.get('index', None),
'legend_index': as_dict.get('legendIndex', None),
'name': as_dict.get('name', None),
'stack': as_dict.get('stack', None),
'x_axis': as_dict.get('xAxis', None),
'y_axis': as_dict.get('yAxis', None),
'z_index': as_dict.get('zIndex', None),
}
return kwargs
def _to_untrimmed_dict(self, in_cls = None) -> dict:
untrimmed = mro__to_untrimmed_dict(self, in_cls = in_cls)
return untrimmed
[docs]class XRangeSeries(BaseBarSeries, XRangeOptions):
"""Options to apply to an X-Range series.
The X-range series displays ranges on the X axis, typically time intervals with a
start and end date.
.. tabs::
.. tab:: Standard X-Range
.. figure:: ../../../_static/xrange-example.png
:alt: X-Range Example Chart
:align: center
.. tab:: Inverted X-Range
.. figure:: ../../../_static/xrange-example-inverted.png
:alt: Inverted X-Range Example Chart
:align: center
"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
@classmethod
def _data_collection_class(cls):
"""Returns the class object used for the data collection.
:rtype: :class:`DataPointCollection <highcharts_core.options.series.data.collections.DataPointCollection>`
descendent
"""
return XRangeData
@classmethod
def _data_point_class(cls):
"""Returns the class object used for individual data points.
:rtype: :class:`DataBase <highcharts_core.options.series.data.base.DataBase>`
descendent
"""
return XRangeDataCollection
@property
def data(self) -> Optional[List[XRangeData] | XRangeDataCollection]:
"""Collection of data that represents the series. Defaults to
:obj:`None <python:None>`.
While the series type returns a collection of :class:`XRangeData` instances,
it accepts as input an iterable of :class:`XRangeData` instances or
:class:`dict <python:dict>` instances that can be coerced to :class:`XRangeData`.
:rtype: :class:`list <python:list>` of :class:`XRangeData` or
:class:`XRangeDataCollection` or
:obj:`None <python:None>`
"""
return self._data
@data.setter
def data(self, value):
if not is_ndarray(value) and not value:
self._data = None
else:
self._data = XRangeData.from_array(value)
@classmethod
def _get_kwargs_from_dict(cls, as_dict):
kwargs = {
'accessibility': as_dict.get('accessibility', None),
'allow_point_select': as_dict.get('allowPointSelect', None),
'animation': as_dict.get('animation', None),
'class_name': as_dict.get('className', None),
'clip': as_dict.get('clip', None),
'color': as_dict.get('color', None),
'cursor': as_dict.get('cursor', None),
'custom': as_dict.get('custom', None),
'dash_style': as_dict.get('dashStyle', None),
'data_labels': as_dict.get('dataLabels', None),
'description': as_dict.get('description', None),
'enable_mouse_tracking': as_dict.get('enableMouseTracking', None),
'events': as_dict.get('events', None),
'include_in_data_export': as_dict.get('includeInDataExport', None),
'keys': as_dict.get('keys', None),
'label': as_dict.get('label', None),
'legend_symbol': as_dict.get('legendSymbol', None),
'linked_to': as_dict.get('linkedTo', None),
'marker': as_dict.get('marker', None),
'on_point': as_dict.get('onPoint', None),
'opacity': as_dict.get('opacity', None),
'point': as_dict.get('point', None),
'point_description_formatter': as_dict.get('pointDescriptionFormatter', None),
'selected': as_dict.get('selected', None),
'show_checkbox': as_dict.get('showCheckbox', None),
'show_in_legend': as_dict.get('showInLegend', None),
'skip_keyboard_navigation': as_dict.get('skipKeyboardNavigation', None),
'sonification': as_dict.get('sonification', None),
'states': as_dict.get('states', None),
'sticky_tracking': as_dict.get('stickyTracking', None),
'threshold': as_dict.get('threshold', None),
'tooltip': as_dict.get('tooltip', None),
'turbo_threshold': as_dict.get('turboThreshold', None),
'visible': as_dict.get('visible', None),
'animation_limit': as_dict.get('animationLimit', None),
'boost_blending': as_dict.get('boostBlending', None),
'boost_threshold': as_dict.get('boostThreshold', None),
'color_axis': as_dict.get('colorAxis', None),
'color_index': as_dict.get('colorIndex', None),
'color_key': as_dict.get('colorKey', None),
'connect_ends': as_dict.get('connectEnds', None),
'connect_nulls': as_dict.get('connectNulls', None),
'crisp': as_dict.get('crisp', None),
'crop_threshold': as_dict.get('cropThreshold', None),
'data_sorting': as_dict.get('dataSorting', None),
'drag_drop': as_dict.get('dragDrop', None),
'fill_color': as_dict.get('fillColor', None),
'fill_opacity': as_dict.get('fillOpacity', None),
'find_nearest_point_by': as_dict.get('findNearestPointBy', None),
'get_extremes_from_all': as_dict.get('getExtremesFromAll', None),
'inactive_other_points': as_dict.get('inactiveOtherPoints', None),
'linecap': as_dict.get('linecap', None),
'line_color': as_dict.get('lineColor', None),
'line_width': as_dict.get('lineWidth', None),
'negative_color': as_dict.get('negativeColor', None),
'negative_fill_color': as_dict.get('negativeFillColor', None),
'point_interval': as_dict.get('pointInterval', None),
'point_interval_unit': as_dict.get('pointIntervalUnit', None),
'point_placement': as_dict.get('pointPlacement', None),
'point_start': as_dict.get('pointStart', None),
'relative_x_value': as_dict.get('relativeXValue', None),
'shadow': as_dict.get('shadow', None),
'soft_threshold': as_dict.get('softThreshold', None),
'stacking': as_dict.get('stacking', None),
'step': as_dict.get('step', None),
'track_by_area': as_dict.get('trackByArea', None),
'zone_axis': as_dict.get('zoneAxis', None),
'zones': as_dict.get('zones', None),
'border_color': as_dict.get('borderColor', None),
'border_radius': as_dict.get('borderRadius', None),
'border_width': as_dict.get('borderWidth', None),
'center_in_category': as_dict.get('centerInCategory', None),
'color_by_point': as_dict.get('colorByPoint', None),
'colors': as_dict.get('colors', None),
'grouping': as_dict.get('grouping', None),
'group_padding': as_dict.get('groupPadding', None),
'max_point_width': as_dict.get('maxPointWidth', None),
'min_point_length': as_dict.get('minPointLength', None),
'point_padding': as_dict.get('pointPadding', None),
'point_range': as_dict.get('pointRange', None),
'point_width': as_dict.get('pointWidth', None),
'group_z_padding': as_dict.get('groupZPadding', None),
'partial_fill': as_dict.get('partialFill', None),
'data': as_dict.get('data', None),
'id': as_dict.get('id', None),
'index': as_dict.get('index', None),
'legend_index': as_dict.get('legendIndex', None),
'name': as_dict.get('name', None),
'stack': as_dict.get('stack', None),
'x_axis': as_dict.get('xAxis', None),
'y_axis': as_dict.get('yAxis', None),
'z_index': as_dict.get('zIndex', None),
}
return kwargs
def _to_untrimmed_dict(self, in_cls = None) -> dict:
untrimmed = mro__to_untrimmed_dict(self, in_cls = in_cls)
return untrimmed