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