From 7897df44b313191ba76c4c13bb83aae50fccfdec Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Wed, 22 May 2024 23:29:26 +0100 Subject: [PATCH 1/4] Add support for vispy 3D viewers --- glue_jupyter/app.py | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/glue_jupyter/app.py b/glue_jupyter/app.py index ea2a46bc..11a06d0e 100644 --- a/glue_jupyter/app.py +++ b/glue_jupyter/app.py @@ -371,7 +371,7 @@ def scatter2d(self, *, data=None, x=None, y=None, widget='bqplot', color=None, view.layers[0].state.update_from_dict(layer_state) return view - def scatter3d(self, *, data=None, x=None, y=None, z=None, show=True): + def scatter3d(self, *, data=None, x=None, y=None, z=None, widget='ipyvolume', show=True): """ Open an interactive 3d scatter plot viewer. @@ -387,17 +387,26 @@ def scatter3d(self, *, data=None, x=None, y=None, z=None, show=True): The attribute to show on the y axis. z : str or `~glue.core.component_id.ComponentID`, optional The attribute to show on the z axis. + widget : {'ipyvolume', 'vispy'} + Whether to use ipyvolume or VisPy as the front-end. show : bool, optional Whether to show the view immediately (`True`) or whether to only show it later if the ``show()`` method is called explicitly (`False`). """ - from .ipyvolume import IpyvolumeScatterView + if widget == 'ipyvolume': + from .ipyvolume import IpyvolumeScatterView + viewer_cls = IpyvolumeScatterView + elif widget == 'vispy': + from glue_vispy_viewers.scatter.jupyter import JupyterVispyScatterViewer + viewer_cls = JupyterVispyScatterViewer + else: + raise ValueError("widget= should be 'ipyvolume' or 'vispy'") data = validate_data_argument(self.data_collection, data) - view = self.new_data_viewer(IpyvolumeScatterView, data=data, show=show) + view = self.new_data_viewer(viewer_cls, data=data, show=show) if x is not None: x = data.id[x] view.state.x_att = x @@ -500,7 +509,7 @@ def profile1d(self, *, data=None, x=None, widget='bqplot', show=True): return view - def volshow(self, *, data=None, x=None, y=None, z=None, show=True): + def volshow(self, *, data=None, x=None, y=None, z=None, widget='ipyvolume', show=True): """ Open an interactive volume viewer. @@ -519,16 +528,26 @@ def volshow(self, *, data=None, x=None, y=None, z=None, show=True): z : str or `~glue.core.component_id.ComponentID`, optional The attribute to show on the z axis. This should be one of the pixel axis attributes. + widget : {'ipyvolume', 'vispy'} + Whether to use ipyvolume or VisPy as the front-end. show : bool, optional Whether to show the view immediately (`True`) or whether to only show it later if the ``show()`` method is called explicitly (`False`). """ - from .ipyvolume import IpyvolumeVolumeView + + if widget == 'ipyvolume': + from .ipyvolume import IpyvolumeVolumeView + viewer_cls = IpyvolumeVolumeView + elif widget == 'vispy': + from glue_vispy_viewers.volume.jupyter import JupyterVispyVolumeViewer + viewer_cls = JupyterVispyVolumeViewer + else: + raise ValueError("widget= should be 'ipyvolume' or 'vispy'") data = validate_data_argument(self.data_collection, data) - view = self.new_data_viewer(IpyvolumeVolumeView, data=data, show=show) + view = self.new_data_viewer(viewer_cls, data=data, show=show) if x is not None: x = data.id[x] From a5eee207b25a4b59f16ac5c4fe05c75f0bf1ee1f Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 23 May 2024 14:45:22 +0100 Subject: [PATCH 2/4] Make sure we use the jupyter_rfb backend for vispy --- glue_jupyter/conftest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/glue_jupyter/conftest.py b/glue_jupyter/conftest.py index ddae2346..248c8c33 100644 --- a/glue_jupyter/conftest.py +++ b/glue_jupyter/conftest.py @@ -76,6 +76,9 @@ def app(dataxyz, datax, dataxz, data_volume, data_image): SOLARA_INSTALLED = True +import vispy # noqa +vispy.use('jupyter_rfb') + # Tweak IPython's display to not print out lots of __repr__s for widgets to # standard output. However, if we are using solara, we shouldn't do this as # it seems to cause issues. From 8e76da97bd387ec69b53a48a48493f398b2b9436 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Wed, 29 May 2024 14:00:58 +0100 Subject: [PATCH 3/4] Updated glue-vispy-viewer dependency --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 8ec43920..e0ac4480 100644 --- a/setup.cfg +++ b/setup.cfg @@ -15,7 +15,7 @@ setup_requires = setuptools_scm install_requires = glue-core>=1.20.0 - glue-vispy-viewers>=1.0 + glue-vispy-viewers[jupyter]>=1.2.1 notebook>=4.0 ipympl>=0.3.0 ipyvolume>=0.5.0 From 488287dbae23f75a984c8853b8c3998c96c59367 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Wed, 26 Jun 2024 13:49:53 +0100 Subject: [PATCH 4/4] Fixed warning configuration following Numpy 2.0 release --- setup.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index e0ac4480..916e31aa 100644 --- a/setup.cfg +++ b/setup.cfg @@ -87,8 +87,8 @@ filterwarnings = ignore::FutureWarning:traitlets.*: # numpy/linalg/linalg.py:2514 (1.21) or numpy/core/_asarray.py:83 (1.19): # `x = asarray(x)` - triggered by `example_volume` from `ipv.examples.ball() - ignore:Creating an ndarray from ragged nested sequences:numpy.VisibleDeprecationWarning:numpy.core.*: - ignore:Creating an ndarray from ragged nested sequences:numpy.VisibleDeprecationWarning:numpy.linalg.*: + ignore:Creating an ndarray from ragged nested sequences::numpy.core.*: + ignore:Creating an ndarray from ragged nested sequences::numpy.linalg.*: ignore:'contextfilter' is renamed to 'pass_context':DeprecationWarning: # potentially more serious, but possibly also only erratic - report them, but don't raise # ignore:numpy.ndarray size changed:RuntimeWarning:astropy.*: