From 0cd01cc2757f98d694ba23e618b815c38238c390 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Thu, 23 Jul 2020 20:48:36 +0200 Subject: [PATCH 1/4] Ensure HoloViews plot ranges are merged correctly --- panel/pane/holoviews.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/panel/pane/holoviews.py b/panel/pane/holoviews.py index f5255128b7..be5535b321 100644 --- a/panel/pane/holoviews.py +++ b/panel/pane/holoviews.py @@ -12,7 +12,7 @@ import param -from bokeh.models import Spacer as _BkSpacer +from bokeh.models import Spacer as _BkSpacer, Range1d from ..io import state, unlocked from ..layout import Column, WidgetBox, HSpacer, VSpacer, Row @@ -276,12 +276,12 @@ def _render(self, doc, comm, root): if backend == 'bokeh' and mode != renderer.mode: renderer = renderer.instance(mode=mode) + kwargs = {'margin': self.margin} if backend == 'bokeh' or LooseVersion(str(hv.__version__)) >= str('1.13.0'): - kwargs = {'doc': doc, 'root': root} + kwargs['doc'] = doc + kwargs['root'] = root if comm: kwargs['comm'] = comm - else: - kwargs = {} return renderer.get_plot(self.object, **kwargs) @@ -520,7 +520,7 @@ def link_axes(root_view, root_model): return from holoviews.core.options import Store - from holoviews.core.util import unique_iterator + from holoviews.core.util import unique_iterator, max_range from holoviews.plotting.bokeh.element import ElementPlot ref = root_model.ref['id'] @@ -548,6 +548,13 @@ def link_axes(root_view, root_model): for (tag), axes in range_map.items(): fig, p, ax, axis = axes[0] + if isinstance(axis, Range1d): + start, end = max_range([ + (ax[-1].start, ax[-1].end) for ax in axes + if isinstance(ax[-1], Range1d) + ]) + axis.start = start + axis.end = end for fig, p, pax, _ in axes[1:]: changed = [] if type(ax) is not type(pax): From 53a4f5691b253f2de2adae09c564abfae232c724 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Thu, 23 Jul 2020 20:51:06 +0200 Subject: [PATCH 2/4] Add test --- .travis.yml | 3 +-- panel/tests/pane/test_holoviews.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a2020511d8..27d4462678 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ git: depth: 100 -language: generic +language: python os: - linux @@ -18,7 +18,6 @@ addons: env: global: - - PYENV_VERSION=3.7 - CHANS_DEV="-c pyviz/label/dev -c bokeh/label/dev -c conda-forge" - CHANS_REL="-c pyviz -c bokeh -c conda-forge" - LABELS_DEV="--label dev" diff --git a/panel/tests/pane/test_holoviews.py b/panel/tests/pane/test_holoviews.py index c2762ba1fb..c8423b3eef 100644 --- a/panel/tests/pane/test_holoviews.py +++ b/panel/tests/pane/test_holoviews.py @@ -406,6 +406,21 @@ def test_holoviews_linked_axes(document, comm): assert p1.x_range is p2.x_range assert p1.y_range is p2.y_range +@hv_available +def test_holoviews_linked_axes_merged_ranges(document, comm): + c1 = hv.Curve([1, 2, 3]) + c2 = hv.Curve([0, 1, 2, 3, 4]) + + layout = Row(HoloViews(c1, backend='bokeh'), HoloViews(c2, backend='bokeh')) + + row_model = layout.get_root(document, comm=comm) + + p1, p2 = row_model.select({'type': Figure}) + + assert p1.x_range is p2.x_range + assert p1.y_range is p2.y_range + assert p1.y_range.start == 0 + assert p1.y_range.end == 4 @hv_available def test_holoviews_linked_x_axis(document, comm): From b0be4905f689d1bb1d3dd992608a10f6966ffe64 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Thu, 23 Jul 2020 21:01:10 +0200 Subject: [PATCH 3/4] Fixed matplotlib bug --- examples/reference/panes/Matplotlib.ipynb | 14 ++++++++++++++ panel/pane/plot.py | 2 ++ 2 files changed, 16 insertions(+) diff --git a/examples/reference/panes/Matplotlib.ipynb b/examples/reference/panes/Matplotlib.ipynb index c1f62a0812..b2ca992965 100644 --- a/examples/reference/panes/Matplotlib.ipynb +++ b/examples/reference/panes/Matplotlib.ipynb @@ -128,6 +128,20 @@ "metadata": {}, "outputs": [], "source": [ + "fig = Figure(figsize=(8, 6))\n", + "ax = fig.add_subplot(111)\n", + "\n", + "dx, dy = 0.05, 0.05\n", + "\n", + "# generate 2 2d grids for the x & y bounds\n", + "y, x = np.mgrid[slice(1, 5 + dy, dy),\n", + " slice(1, 5 + dx, dx)]\n", + "\n", + "z = np.sin(x)**10 + np.cos(10 + y*x) * np.cos(x)\n", + "\n", + "cf = ax.contourf(x + dx/2., y + dy/2., z)\n", + "fig.colorbar(cf, ax=ax)\n", + "\n", "pn.pane.Matplotlib(fig, interactive=True, dpi=72)" ] }, diff --git a/panel/pane/plot.py b/panel/pane/plot.py index 1c3a5c65bf..810bd7b487 100644 --- a/panel/pane/plot.py +++ b/panel/pane/plot.py @@ -133,6 +133,8 @@ class Matplotlib(PNG, IPyWidget): Automatically adjust the figure size to fit the subplots and other artist elements.""") + _rename = {'object': 'text', 'interactive': None, 'dpi': None, 'tight': None} + _rerender_params = PNG._rerender_params + ['object', 'dpi', 'tight'] @classmethod From 036f48214c0222be1060f0ea05339f7cc3743e9a Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Thu, 23 Jul 2020 21:17:35 +0200 Subject: [PATCH 4/4] Fixed test --- panel/tests/pane/test_holoviews.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/panel/tests/pane/test_holoviews.py b/panel/tests/pane/test_holoviews.py index c8423b3eef..2292e84c24 100644 --- a/panel/tests/pane/test_holoviews.py +++ b/panel/tests/pane/test_holoviews.py @@ -406,6 +406,7 @@ def test_holoviews_linked_axes(document, comm): assert p1.x_range is p2.x_range assert p1.y_range is p2.y_range + @hv_available def test_holoviews_linked_axes_merged_ranges(document, comm): c1 = hv.Curve([1, 2, 3]) @@ -419,8 +420,9 @@ def test_holoviews_linked_axes_merged_ranges(document, comm): assert p1.x_range is p2.x_range assert p1.y_range is p2.y_range - assert p1.y_range.start == 0 - assert p1.y_range.end == 4 + assert p1.y_range.start == -0.4 + assert p1.y_range.end == 4.4 + @hv_available def test_holoviews_linked_x_axis(document, comm):