From b0aa3ec021e8f84a7952203212367d0823746b03 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Wed, 31 Aug 2016 21:24:41 +0100 Subject: [PATCH 1/4] Correctly initialize comms and connect streams --- holoviews/plotting/plot.py | 21 +++++++++++++++------ holoviews/plotting/util.py | 10 ++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/holoviews/plotting/plot.py b/holoviews/plotting/plot.py index 5d70a04f86..0910a27712 100644 --- a/holoviews/plotting/plot.py +++ b/holoviews/plotting/plot.py @@ -19,7 +19,8 @@ from ..core.overlay import NdOverlay from ..core.spaces import HoloMap, DynamicMap from ..element import Table -from .util import get_dynamic_mode, initialize_sampled, dim_axis_label +from .util import (get_dynamic_mode, initialize_sampled, dim_axis_label, + attach_streams) class Plot(param.Parameterized): @@ -197,10 +198,6 @@ def __init__(self, keys=None, dimensions=None, layout_dimensions=None, self.ranges = {} self.renderer = renderer if renderer else Store.renderers[self.backend].instance() - comm = None - if self.dynamic or self.renderer.widget_mode == 'live': - comm = self.renderer.comms[self.renderer.mode][0](self) - self.comm = comm params = {k: v for k, v in params.items() if k in self.params()} super(DimensionedPlot, self).__init__(**params) @@ -478,7 +475,7 @@ def update(self, key): return self.__getitem__(key) - def refresh(self): + def refresh(self, **kwargs): """ Refreshes the plot by rerendering it and then pushing the updated data if the plot has an associated Comm. @@ -559,6 +556,12 @@ def __init__(self, element, keys=None, ranges=None, dimensions=None, super(GenericElementPlot, self).__init__(keys=keys, dimensions=dimensions, dynamic=dynamic, **dict(params, **plot_opts)) + comm = None + if subplot: + if dynamic or self.renderer.widget_mode == 'live': + comm = self.renderer.comms[self.renderer.mode][0](self) + attach_streams(self, element) + self.comm = comm # Update plot and style options for batched plots if self.batched: @@ -904,6 +907,12 @@ def __init__(self, layout, keys=None, dimensions=None, **params): dynamic=dynamic, dimensions=dimensions, **params) + comm = None + if subplot: + if self.dynamic or self.renderer.widget_mode == 'live': + comm = self.renderer.comms[self.renderer.mode][0](self) + attach_streams(self, layout) + self.comm = comm def _get_frame(self, key): diff --git a/holoviews/plotting/util.py b/holoviews/plotting/util.py index 26612a7b97..171f7362f2 100644 --- a/holoviews/plotting/util.py +++ b/holoviews/plotting/util.py @@ -275,3 +275,13 @@ def dim_axis_label(dimensions, separator=', '): if not isinstance(dimensions, list): dimensions = [dimensions] return separator.join([safe_unicode(d.pprint_label) for d in dimensions]) + + +def attach_streams(plot, obj): + """ + Attaches plot refresh to all streams on the object. + """ + def append_refresh(dmap): + for stream in dmap.streams: + stream._hidden_subscribers.append(plot.refresh) + return obj.traverse(append_refresh, [DynamicMap]) From 60a4bfd801118b49d12448cee15e659ca8cac933 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Wed, 31 Aug 2016 22:28:31 +0100 Subject: [PATCH 2/4] Ensured all DimensionedPlots have a comm attribute --- holoviews/plotting/plot.py | 1 + 1 file changed, 1 insertion(+) diff --git a/holoviews/plotting/plot.py b/holoviews/plotting/plot.py index 0910a27712..f01e65929c 100644 --- a/holoviews/plotting/plot.py +++ b/holoviews/plotting/plot.py @@ -197,6 +197,7 @@ def __init__(self, keys=None, dimensions=None, layout_dimensions=None, self.current_key = None self.ranges = {} self.renderer = renderer if renderer else Store.renderers[self.backend].instance() + self.comm = None params = {k: v for k, v in params.items() if k in self.params()} From 3666f40cb9dd4bfdef1e2c6ba7e06f787c6be4e4 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Wed, 31 Aug 2016 22:43:13 +0100 Subject: [PATCH 3/4] Refactored comms and streams initialization on plots --- holoviews/plotting/mpl/raster.py | 6 +++++- holoviews/plotting/plot.py | 35 +++++++++++++++++--------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/holoviews/plotting/mpl/raster.py b/holoviews/plotting/mpl/raster.py index 9f70fcd2bf..615c4393ce 100644 --- a/holoviews/plotting/mpl/raster.py +++ b/holoviews/plotting/mpl/raster.py @@ -277,9 +277,13 @@ class RasterGridPlot(GridPlot, OverlayPlot): def __init__(self, layout, keys=None, dimensions=None, create_axes=False, ranges=None, layout_num=1, **params): - if not keys or not dimensions: + top_level = keys is None + if top_level: dimensions, keys = traversal.unique_dimkeys(layout) MPLPlot.__init__(self, dimensions=dimensions, keys=keys, **params) + if top_level: + self.comm = self.init_comm(element) + self.layout = layout self.cyclic_index = 0 self.zorder = 0 diff --git a/holoviews/plotting/plot.py b/holoviews/plotting/plot.py index f01e65929c..fb4fb79455 100644 --- a/holoviews/plotting/plot.py +++ b/holoviews/plotting/plot.py @@ -499,6 +499,17 @@ def push(self): self.comm.send(diff) + def init_comm(self, obj): + """ + Initializes comm and attaches streams. + """ + comm = None + if self.dynamic or self.renderer.widget_mode == 'live': + comm = self.renderer.comms[self.renderer.mode][0](self) + attach_streams(self, obj) + return comm + + def __len__(self): """ Returns the total number of available frames. @@ -545,8 +556,8 @@ def __init__(self, element, keys=None, ranges=None, dimensions=None, if self.batched: plot_element = plot_element.last - subplot = not keys - if subplot: + top_level = keys is None + if top_level: dimensions = self.hmap.kdims keys = list(self.hmap.data.keys()) @@ -557,12 +568,8 @@ def __init__(self, element, keys=None, ranges=None, dimensions=None, super(GenericElementPlot, self).__init__(keys=keys, dimensions=dimensions, dynamic=dynamic, **dict(params, **plot_opts)) - comm = None - if subplot: - if dynamic or self.renderer.widget_mode == 'live': - comm = self.renderer.comms[self.renderer.mode][0](self) - attach_streams(self, element) - self.comm = comm + if top_level: + self.comm = self.init_comm(element) # Update plot and style options for batched plots if self.batched: @@ -898,8 +905,8 @@ def __init__(self, layout, keys=None, dimensions=None, **params): if 'uniform' not in params: params['uniform'] = traversal.uniform(layout) - subplot = not keys - if subplot: + top_level = keys is None + if top_level: dimensions, keys = traversal.unique_dimkeys(layout) self.layout = layout @@ -908,12 +915,8 @@ def __init__(self, layout, keys=None, dimensions=None, **params): dynamic=dynamic, dimensions=dimensions, **params) - comm = None - if subplot: - if self.dynamic or self.renderer.widget_mode == 'live': - comm = self.renderer.comms[self.renderer.mode][0](self) - attach_streams(self, layout) - self.comm = comm + if top_level: + self.comm = self.init_comm(layout) def _get_frame(self, key): From c7e8ece00fb392d0bc3f70297df3ac15d1e3d35d Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Wed, 31 Aug 2016 23:05:32 +0100 Subject: [PATCH 4/4] Fixed misnamed variable --- holoviews/plotting/mpl/raster.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/holoviews/plotting/mpl/raster.py b/holoviews/plotting/mpl/raster.py index 615c4393ce..d249b582b0 100644 --- a/holoviews/plotting/mpl/raster.py +++ b/holoviews/plotting/mpl/raster.py @@ -282,7 +282,7 @@ def __init__(self, layout, keys=None, dimensions=None, create_axes=False, ranges dimensions, keys = traversal.unique_dimkeys(layout) MPLPlot.__init__(self, dimensions=dimensions, keys=keys, **params) if top_level: - self.comm = self.init_comm(element) + self.comm = self.init_comm(layout) self.layout = layout self.cyclic_index = 0