from __future__ import absolute_import, division, unicode_literals
import numpy as np
import param
from ...core.util import dimension_sanitizer
from ..mixins import GeomMixin
from .element import ColorbarPlot, LegendPlot
from .selection import BokehOverlaySelectionDisplay
from .styles import base_properties, fill_properties, line_properties
[docs]class SegmentPlot(GeomMixin, ColorbarPlot):
"""
Segments are lines in 2D space where each two each dimensions specify a
(x, y) node of the line.
"""
selected = param.List(default=None, doc="""
The current selection as a list of integers corresponding
to the selected items.""")
selection_display = BokehOverlaySelectionDisplay()
style_opts = base_properties + line_properties + ['cmap']
_allow_implicit_categories = False
_nonvectorized_styles = base_properties + ['cmap']
_plot_methods = dict(single='segment')
[docs] def get_data(self, element, ranges, style):
inds = (1, 0, 3, 2) if self.invert_axes else (0, 1, 2, 3)
xd0, yd0, xd1, yd1 = (dimension_sanitizer(element.get_dimension(i).name)
for i in inds)
x0s, y0s, x1s, y1s = (element.dimension_values(kd) for kd in inds)
data = {xd0: x0s, xd1: x1s, yd0: y0s, yd1: y1s}
mapping = dict(x0=xd0, x1=xd1, y0=yd0, y1=yd1)
self._get_hover_data(data, element)
return (data, mapping, style)
[docs]class RectanglesPlot(GeomMixin, LegendPlot, ColorbarPlot):
selected = param.List(default=None, doc="""
The current selection as a list of integers corresponding
to the selected items.""")
selection_display = BokehOverlaySelectionDisplay()
style_opts = (base_properties + line_properties + fill_properties +
['cmap'])
_allow_implicit_categories = False
_nonvectorized_styles = base_properties + ['cmap']
_plot_methods = dict(single='rect')
_batched_style_opts = line_properties + fill_properties
_color_style = 'fill_color'
[docs] def get_data(self, element, ranges, style):
inds = (1, 0, 3, 2) if self.invert_axes else (0, 1, 2, 3)
x0, y0, x1, y1 = (element.dimension_values(kd) for kd in inds)
x0, x1 = np.min([x0, x1], axis=0), np.max([x0, x1], axis=0)
y0, y1 = np.min([y0, y1], axis=0), np.max([y0, y1], axis=0)
data = {
'x': x0+(x1-x0)/2.,
'y': y0+(y1-y0)/2.,
'width': x1-x0,
'height': y1-y0
}
mapping = {'x': 'x', 'y': 'y', 'width': 'width', 'height': 'height'}
self._get_hover_data(data, element)
return data, mapping, style