Skip to content

Commit

Permalink
Replaced empty with static_source optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
philippjfr committed Oct 3, 2017
1 parent e37b111 commit 156dd87
Show file tree
Hide file tree
Showing 8 changed files with 170 additions and 155 deletions.
14 changes: 7 additions & 7 deletions holoviews/plotting/bokeh/annotation.py
Expand Up @@ -30,9 +30,9 @@ def _glyph_properties(self, plot, element, source, ranges):
props['text_color'] = props.pop('color')
return props

def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
mapping = dict(x='x', y='y', text='text')
if empty:
if self.static_source:
return dict(x=[], y=[], text=[]), mapping
if self.invert_axes:
data = dict(x=[element.y], y=[element.x])
Expand All @@ -43,10 +43,10 @@ def get_data(self, element, ranges=None, empty=False):
return (data, mapping)


def get_batched_data(self, element, ranges=None, empty=False):
def get_batched_data(self, element, ranges=None):
data = defaultdict(list)
for key, el in element.data.items():
eldata, elmapping = self.get_data(el, ranges, empty)
eldata, elmapping = self.get_data(el, ranges)
for k, eld in eldata.items():
data[k].extend(eld)
return data, elmapping
Expand All @@ -65,7 +65,7 @@ class LineAnnotationPlot(ElementPlot):

_plot_methods = dict(single='Span')

def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
data, mapping = {}, {}
dim = 'width' if isinstance(element, HLine) else 'height'
if self.invert_axes:
Expand Down Expand Up @@ -99,7 +99,7 @@ class SplinePlot(ElementPlot):
style_opts = line_properties
_plot_methods = dict(single='bezier')

def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
data_attrs = ['x0', 'y0', 'cx0', 'cy0', 'cx1', 'cy1', 'x1', 'y1',]
verts = np.array(element.data[0])
inds = np.where(np.array(element.data[1])==1)[0]
Expand Down Expand Up @@ -130,7 +130,7 @@ class ArrowPlot(CompositeElementPlot):

_plot_methods = dict(single='text')

def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
plot = self.state
label_mapping = dict(x='x', y='y', text='text')

Expand Down
121 changes: 71 additions & 50 deletions holoviews/plotting/bokeh/chart.py
Expand Up @@ -52,35 +52,38 @@ class PointPlot(LegendPlot, ColorbarPlot):
def _get_size_data(self, element, ranges, style):
data, mapping = {}, {}
sdim = element.get_dimension(self.size_index)
if sdim:
map_key = 'size_' + sdim.name
ms = style.get('size', np.sqrt(6))**2
sizes = element.dimension_values(self.size_index)
sizes = compute_sizes(sizes, self.size_fn,
self.scaling_factor,
self.scaling_method, ms)
if sizes is None:
eltype = type(element).__name__
self.warning('%s dimension is not numeric, cannot '
'use to scale %s size.' % (sdim.pprint_label, eltype))
else:
data[map_key] = np.sqrt(sizes)
mapping['size'] = map_key
if not sdim or self.static_source:
return data, mapping

map_key = 'size_' + sdim.name
ms = style.get('size', np.sqrt(6))**2
sizes = element.dimension_values(self.size_index)
sizes = compute_sizes(sizes, self.size_fn,
self.scaling_factor,
self.scaling_method, ms)
if sizes is None:
eltype = type(element).__name__
self.warning('%s dimension is not numeric, cannot '
'use to scale %s size.' % (sdim.pprint_label, eltype))
else:
data[map_key] = np.sqrt(sizes)
mapping['size'] = map_key
return data, mapping


def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
style = self.style[self.cyclic_index]
dims = element.dimensions(label=True)

xidx, yidx = (1, 0) if self.invert_axes else (0, 1)
mapping = dict(x=dims[xidx], y=dims[yidx])
data = {}

xdim, ydim = dims[xidx], dims[yidx]
data[xdim] = [] if empty else element.dimension_values(xidx)
data[ydim] = [] if empty else element.dimension_values(yidx)
self._categorize_data(data, (xdim, ydim), element.dimensions())
if not self.static_source:
xdim, ydim = dims[xidx], dims[yidx]
data[xdim] = element.dimension_values(xidx)
data[ydim] = element.dimension_values(yidx)
self._categorize_data(data, (xdim, ydim), element.dimensions())

cdata, cmapping = self._get_color_data(element, ranges, style)
data.update(cdata)
Expand All @@ -90,21 +93,25 @@ def get_data(self, element, ranges=None, empty=False):
data.update(sdata)
mapping.update(smapping)

self._get_hover_data(data, element, empty)
self._get_hover_data(data, element)
return data, mapping


def get_batched_data(self, element, ranges=None, empty=False):
def get_batched_data(self, element, ranges=None):
data = defaultdict(list)
zorders = self._updated_zorders(element)
styles = self.lookup_options(element.last, 'style')
styles = styles.max_cycles(len(self.ordering))
for (key, el), zorder in zip(element.data.items(), zorders):
self.set_param(**self.lookup_options(el, 'plot').options)
eldata, elmapping = self.get_data(el, ranges, empty)
eldata, elmapping = self.get_data(el, ranges)
for k, eld in eldata.items():
data[k].append(eld)

# Skip if data is empty
if not eldata:
continue

# Apply static styles
nvals = len(list(eldata.values())[0])
style = styles[zorder]
Expand Down Expand Up @@ -178,7 +185,7 @@ def _glyph_properties(self, *args):
return properties


def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
style = self.style[self.cyclic_index]
input_scale = style.pop('scale', 1.0)

Expand Down Expand Up @@ -248,15 +255,18 @@ class CurvePlot(ElementPlot):
_plot_methods = dict(single='line', batched='multi_line')
_batched_style_opts = line_properties

def get_data(self, element, ranges=None, empty=False):
if 'steps' in self.interpolation:
element = interpolate_curve(element, interpolation=self.interpolation)
def get_data(self, element, ranges=None):
xidx, yidx = (1, 0) if self.invert_axes else (0, 1)
x = element.get_dimension(xidx).name
y = element.get_dimension(yidx).name
data = {x: [] if empty else element.dimension_values(xidx),
y: [] if empty else element.dimension_values(yidx)}
self._get_hover_data(data, element, empty)
if self.static_source:
return {}, dict(x=x, y=y)

if 'steps' in self.interpolation:
element = interpolate_curve(element, interpolation=self.interpolation)
data = {x: element.dimension_values(xidx),
y: element.dimension_values(yidx)}
self._get_hover_data(data, element)
self._categorize_data(data, (x, y), element.dimensions())
return (data, dict(x=x, y=y))

Expand All @@ -269,7 +279,7 @@ def _hover_opts(self, element):
line_policy = 'nearest'
return dims, dict(line_policy=line_policy)

def get_batched_data(self, overlay, ranges=None, empty=False):
def get_batched_data(self, overlay, ranges=None):
data = defaultdict(list)

zorders = self._updated_zorders(overlay)
Expand All @@ -278,7 +288,12 @@ def get_batched_data(self, overlay, ranges=None, empty=False):

for (key, el), zorder in zip(overlay.data.items(), zorders):
self.set_param(**self.lookup_options(el, 'plot').options)
eldata, elmapping = self.get_data(el, ranges, empty)
eldata, elmapping = self.get_data(el, ranges)

# Skip if data empty
if not eldata:
continue

for k, eld in eldata.items():
data[k].append(eld)

Expand Down Expand Up @@ -306,17 +321,17 @@ class HistogramPlot(ElementPlot):
style_opts = line_properties + fill_properties
_plot_methods = dict(single='quad')

def get_data(self, element, ranges=None, empty=None):
def get_data(self, element, ranges=None):
if self.invert_axes:
mapping = dict(top='left', bottom='right', left=0, right='top')
else:
mapping = dict(top='top', bottom=0, left='left', right='right')
if empty:
if self.static_source:
data = dict(top=[], left=[], right=[])
else:
data = dict(top=element.values, left=element.edges[:-1],
right=element.edges[1:])
self._get_hover_data(data, element, empty)
self._get_hover_data(data, element)
return (data, mapping)

def get_extents(self, element, ranges):
Expand Down Expand Up @@ -350,13 +365,13 @@ class SideHistogramPlot(ColorbarPlot, HistogramPlot):
main_source.trigger('change')
"""

def get_data(self, element, ranges=None, empty=None):
def get_data(self, element, ranges=None):
if self.invert_axes:
mapping = dict(top='right', bottom='left', left=0, right='top')
else:
mapping = dict(top='top', bottom=0, left='left', right='right')

if empty:
if self.static_source:
data = dict(top=[], left=[], right=[])
else:
data = dict(top=element.values, left=element.edges[:-1],
Expand All @@ -366,10 +381,10 @@ def get_data(self, element, ranges=None, empty=None):
dim = color_dims[0] if color_dims else None
cmapper = self._get_colormapper(dim, element, {}, {})
if cmapper and dim in element.dimensions():
data[dim.name] = [] if empty else element.dimension_values(dim)
data[dim.name] = [] if self.static_source else element.dimension_values(dim)
mapping['fill_color'] = {'field': dim.name,
'transform': cmapper}
self._get_hover_data(data, element, empty)
self._get_hover_data(data, element)
return (data, mapping)


Expand Down Expand Up @@ -409,8 +424,11 @@ class ErrorPlot(ElementPlot):

_plot_methods = dict(single=Whisker)

def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
mapping = dict(self._mapping)
if self.static_source:
return {}, mapping

base = element.dimension_values(0)
ys = element.dimension_values(1)
if len(element.vdims) > 2:
Expand Down Expand Up @@ -471,7 +489,11 @@ def get_extents(self, element, ranges):
ranges[vdim] = (np.nanmin([0, ranges[vdim][0]]), ranges[vdim][1])
return super(AreaPlot, self).get_extents(element, ranges)

def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
mapping = dict(self._mapping)
if self.static_source:
return {}, mapping

xs = element.dimension_values(0)
if len(element.vdims) > 1:
lower = element.dimension_values(2)
Expand All @@ -480,7 +502,6 @@ def get_data(self, element, ranges=None, empty=False):
upper = element.dimension_values(1)
data = dict(base=xs, upper=upper, lower=lower)

mapping = dict(self._mapping)
if self.invert_axes:
mapping['dimension'] = 'width'
else:
Expand Down Expand Up @@ -529,13 +550,13 @@ def get_extents(self, element, ranges):
t = np.nanmax([0, t])
return l, b, r, t

def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
style = self.style[self.cyclic_index]
dims = element.dimensions(label=True)

pos = self.position
mapping = dict(xs='xs', ys='ys')
if len(element) == 0:
if len(element) == 0 or self.static_source:
xs, ys = [], []
elif len(dims) > 1:
xs, ys = zip(*((np.array([x, x]), np.array([pos+y, pos]))
Expand All @@ -545,16 +566,16 @@ def get_data(self, element, ranges=None, empty=False):
xs, ys = zip(*((np.array([x[0], x[0]]), np.array([pos+height, pos]))
for x in element.array(dims[:1])))

if not empty and self.invert_axes: xs, ys = ys, xs
if self.invert_axes: xs, ys = ys, xs
data = dict(zip(('xs', 'ys'), (xs, ys)))
cdim = element.get_dimension(self.color_index)
if cdim:
cmapper = self._get_colormapper(cdim, element, ranges, style)
data[cdim.name] = [] if empty else element.dimension_values(cdim)
data[cdim.name] = [] if self.static_source else element.dimension_values(cdim)
mapping['color'] = {'field': cdim.name,
'transform': cmapper}

if any(isinstance(t, HoverTool) for t in self.state.tools):
if any(isinstance(t, HoverTool) for t in self.state.tools) and not self.static_source:
for d in dims:
data[dimension_sanitizer(d)] = element.dimension_values(d)

Expand Down Expand Up @@ -742,7 +763,7 @@ def _glyph_properties(self, *args):
del props['width']
return props

def get_data(self, element, ranges, empty):
def get_data(self, element, ranges):
# Get x, y, group, stack and color dimensions
grouping = None
group_dim = element.get_dimension(self.group_index)
Expand Down Expand Up @@ -916,11 +937,11 @@ def get_data(self, element, ranges, empty):

return sanitized_data, mapping

def get_batched_data(self, element, ranges, empty):
def get_batched_data(self, element, ranges):
el = element.last
collapsed = Bars(element.table(), kdims=el.kdims+element.kdims,
vdims=el.vdims)
return self.get_data(collapsed, ranges, empty)
return self.get_data(collapsed, ranges)



Expand Down Expand Up @@ -995,7 +1016,7 @@ def _get_factors(self, element):
else:
return factors, []

def get_data(self, element, ranges=None, empty=False):
def get_data(self, element, ranges=None):
if element.kdims:
groups = element.groupby(element.kdims).data
else:
Expand Down

0 comments on commit 156dd87

Please sign in to comment.