Skip to content

Commit

Permalink
jdaviz 3.9 updates (#68)
Browse files Browse the repository at this point in the history
  • Loading branch information
kecnry authored Apr 5, 2024
1 parent 8397989 commit f3edb89
Show file tree
Hide file tree
Showing 20 changed files with 73 additions and 124 deletions.
1 change: 1 addition & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
------------------

* Ability to create additional viewers. [#94]
* Updates to use jdaviz 3.9. [#68]

0.2.0 (02-26-2024)
------------------
Expand Down
14 changes: 7 additions & 7 deletions docs/plugins.rst
Original file line number Diff line number Diff line change
Expand Up @@ -318,18 +318,18 @@ This plugin supports binning a light curve in time or phase-space.
* :meth:`lightkurve.LightCurve.bin`


.. _export-plot:
.. _export:

Export Plot
===========
Export
======

This plugin allows exporting the plot in a given viewer to various image formats.


.. admonition:: User API Example
:class: dropdown

See the :class:`~lcviz.plugins.export_plot.export_plot.ExportViewer` user API documentation for more details.
See the :class:`~lcviz.plugins.export.export.Export` user API documentation for more details.

.. code-block:: python
Expand All @@ -340,11 +340,11 @@ This plugin allows exporting the plot in a given viewer to various image formats
lcviz.load_data(lc)
lcviz.show()
export = lcviz.plugins['Export Plot']
export.save_figure('test.png')
export = lcviz.plugins['Export']
export.export('test.png')
.. seealso::

:ref:`Jdaviz Export Plot <jdaviz:imviz-export-plot>`
Jdaviz documentation on the Export Plot plugin.
Jdaviz documentation on the Export plugin.
2 changes: 1 addition & 1 deletion docs/reference/api_plugins.rst
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Plugins API
.. automodapi:: lcviz.plugins.ephemeris.ephemeris
:no-inheritance-diagram:

.. automodapi:: lcviz.plugins.export_plot.export_plot
.. automodapi:: lcviz.plugins.export.export
:no-inheritance-diagram:

.. automodapi:: lcviz.plugins.flatten.flatten
Expand Down
10 changes: 3 additions & 7 deletions lcviz/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,11 @@ class LCviz(ConfigHelper):
'tab_headers': True},
'dense_toolbar': False,
'context': {'notebook': {'max_height': '600px'}}},
'toolbar': ['g-data-tools', 'g-subset-tools', 'lcviz-viewer-creator', 'lcviz-coords-info'],
'toolbar': ['g-data-tools', 'g-subset-tools', 'g-viewer-creator', 'lcviz-coords-info'],
'tray': ['lcviz-metadata-viewer', 'flux-column',
'lcviz-plot-options', 'lcviz-subset-plugin',
'lcviz-markers', 'flatten', 'frequency-analysis', 'ephemeris',
'binning', 'lcviz-export-plot'],
'binning', 'lcviz-export'],
'viewer_area': [{'container': 'col',
'children': [{'container': 'row',
'viewers': [{'name': 'flux-vs-time',
Expand All @@ -92,11 +92,7 @@ def __init__(self, *args, **kwargs):
)

# inject custom css from lcviz_style.vue (on top of jdaviz styles)
if hasattr(self.app, '_add_style'):
# will be guaranteed after jdaviz 3.9
self.app._add_style((__file__, 'lcviz_style.vue'))
else:
self.app.set_style_template_file((__file__, 'lcviz_style.vue'))
self.app._add_style((__file__, 'lcviz_style.vue'))

# set the link to read the docs
self.app.docs_link = "https://lcviz.readthedocs.io"
Expand Down
4 changes: 0 additions & 4 deletions lcviz/lcviz_style.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
<style>
.lm_tab[title="flux-vs-time"] > .lm_close_tab {
/* hide the close button on the tab for the default time-viewer */
display: none;
}
</style>
2 changes: 1 addition & 1 deletion lcviz/plugins/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from .binning.binning import * # noqa
from .ephemeris.ephemeris import * # noqa
from .export_plot.export_plot import * # noqa
from .export.export import * # noqa
from .flatten.flatten import * # noqa
from .flux_column.flux_column import * # noqa
from .frequency_analysis.frequency_analysis import * # noqa
Expand Down
21 changes: 4 additions & 17 deletions lcviz/plugins/binning/binning.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import numpy as np
from time import time
from astropy.time import Time
from traitlets import Bool, Float, observe
from traitlets import Bool, observe
from glue.config import data_translator

from jdaviz.core.custom_traitlets import IntHandleEmpty
Expand All @@ -10,7 +8,7 @@
from jdaviz.core.template_mixin import (PluginTemplateMixin,
DatasetSelectMixin, AddResultsMixin,
skip_if_no_updates_since_last_active,
with_spinner)
with_spinner, with_temp_disable)
from jdaviz.core.user_api import PluginUserApi

from lcviz.components import FluxColumnSelectMixin
Expand Down Expand Up @@ -54,9 +52,6 @@ class Binning(PluginTemplateMixin, FluxColumnSelectMixin, DatasetSelectMixin,
n_bins = IntHandleEmpty(100).tag(sync=True)
bin_enabled = Bool(True).tag(sync=True)

last_live_time = Float(0).tag(sync=True)
previews_temp_disable = Bool(False).tag(sync=True)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

Expand Down Expand Up @@ -164,20 +159,16 @@ def _toggle_marks(self, event={}):

@observe('flux_column_selected', 'dataset_selected',
'ephemeris_selected',
'n_bins', 'previews_temp_disable')
'n_bins', 'previews_temp_disabled')
@skip_if_no_updates_since_last_active()
@with_temp_disable(timeout=0.3)
def _live_update(self, event={}):
self.bin_enabled = self.n_bins != '' and self.n_bins > 0

if not self.show_live_preview or not self.is_active or not self.bin_enabled:
self._clear_marks()
return

if self.previews_temp_disable:
return

start = time()

if event.get('name', '') not in ('is_active', 'show_live_preview'):
# mark visibility hasn't been handled yet
self._toggle_marks()
Expand Down Expand Up @@ -214,10 +205,6 @@ def _live_update(self, event={}):
mark.times = []
mark.update_xy(times, lc.flux.value)

self.last_live_time = np.round(time() - start, 2)
if self.last_live_time > 0.3:
self.previews_temp_disable = True

def _on_ephemeris_update(self, msg):
if not self.show_live_preview or not self.is_active:
return
Expand Down
22 changes: 5 additions & 17 deletions lcviz/plugins/binning/binning.vue
Original file line number Diff line number Diff line change
Expand Up @@ -57,23 +57,11 @@
</v-text-field>
</v-row>

<v-alert v-if="previews_temp_disable && show_live_preview" type='warning' style="margin-left: -12px; margin-right: -12px">
Live-updating is temporarily disabled (last update took {{last_live_time}}s)
<v-row justify='center'>
<j-tooltip tooltipcontent='hide live preview (can be re-enabled from the settings section in the plugin).' span_style="width: 100%">
<v-btn style='width: 100%' @click="show_live_preview = false">
disable previews
</v-btn>
</j-tooltip>
</v-row>
<v-row justify='center'>
<j-tooltip tooltipcontent='manually update live-previews based on current plugin inputs.' span_style="width: 100%">
<v-btn style='width: 100%' @click="previews_temp_disable = false">
update preview
</v-btn>
</j-tooltip>
</v-row>
</v-alert>
<plugin-previews-temp-disabled
:previews_temp_disabled.sync="previews_temp_disabled"
:previews_last_time="previews_last_time"
:show_live_preview.sync="show_live_preview"
/>

<plugin-add-results
:label.sync="results_label"
Expand Down
3 changes: 2 additions & 1 deletion lcviz/plugins/ephemeris/ephemeris.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,8 @@ def create_phase_viewer(self, ephem_component=None):
phase_viewer_id = self._generate_phase_viewer_id(ephem_component)
# TODO: stack horizontally by default?
self.app._on_new_viewer(NewViewerMessage(PhaseScatterView, data=None, sender=self.app),
vid=phase_viewer_id, name=phase_viewer_id)
vid=phase_viewer_id, name=phase_viewer_id,
open_data_menu_if_empty=False)

# access new viewer, set bookkeeping for ephemeris component
pv = self.app.get_viewer(phase_viewer_id)
Expand Down
1 change: 1 addition & 0 deletions lcviz/plugins/export/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .export import * # noqa
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
from jdaviz.configs.default.plugins import ExportViewer
from jdaviz.configs.default.plugins import Export
from jdaviz.core.registries import tray_registry

__all__ = ['ExportViewer']
__all__ = ['Export']


@tray_registry('lcviz-export-plot', label="Export Plot")
class ExportViewer(ExportViewer):
@tray_registry('lcviz-export', label="Export")
class Export(Export):
"""
See the :ref:`Export Plot Plugin Documentation <export-plot>` for more details.
See the :ref:`Export Plot Plugin Documentation <export>` for more details.
Only the following attributes and methods are available through the
:ref:`public plugin API <plugin-apis>`:
* :meth:`~jdaviz.core.template_mixin.PluginTemplateMixin.show`
* :meth:`~jdaviz.core.template_mixin.PluginTemplateMixin.open_in_tray`
* :meth:`~jdaviz.core.template_mixin.PluginTemplateMixin.close_in_tray`
* ``viewer`` (:class:`~jdaviz.core.template_mixin.ViewerSelect`):
Viewer to select for exporting the figure image.
* :meth:`save_figure`
* ``viewer`` (:class:`~jdaviz.core.template_mixin.ViewerSelect`)
* ``viewer_format`` (:class:`~jdaviz.core.template_mixin.SelectPluginComponent`)
* ``filename``
* :meth:`export`
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.docs_link = f"https://lcviz.readthedocs.io/en/{self.vdocs}/plugins.html#export-plot"
self.docs_link = f"https://lcviz.readthedocs.io/en/{self.vdocs}/plugins.html#export"
1 change: 0 additions & 1 deletion lcviz/plugins/export_plot/__init__.py

This file was deleted.

18 changes: 4 additions & 14 deletions lcviz/plugins/flatten/flatten.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import numpy as np
from time import time

from traitlets import Bool, Float, Unicode, observe
from traitlets import Bool, Unicode, observe

from jdaviz.core.custom_traitlets import FloatHandleEmpty, IntHandleEmpty
from jdaviz.core.events import ViewerAddedMessage
Expand All @@ -10,7 +9,7 @@
DatasetSelectMixin,
AutoTextField,
skip_if_no_updates_since_last_active,
with_spinner)
with_spinner, with_temp_disable)
from jdaviz.core.user_api import PluginUserApi

from lcviz.components import FluxColumnSelectMixin
Expand Down Expand Up @@ -70,9 +69,6 @@ class Flatten(PluginTemplateMixin, FluxColumnSelectMixin, DatasetSelectMixin):
flux_label_invalid_msg = Unicode('').tag(sync=True)
flux_label_overwrite = Bool(False).tag(sync=True)

last_live_time = Float(0).tag(sync=True)
previews_temp_disable = Bool(False).tag(sync=True)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

Expand Down Expand Up @@ -217,16 +213,14 @@ def _toggle_marks(self, event={}):

@observe('dataset_selected', 'flux_column_selected',
'window_length', 'polyorder', 'break_tolerance',
'niters', 'sigma', 'previews_temp_disable')
'niters', 'sigma', 'previews_temp_disabled')
@skip_if_no_updates_since_last_active()
@with_temp_disable(0.3)
def _live_update(self, event={}):
if self.previews_temp_disable:
return
if self.dataset_selected == '' or self.flux_column_selected == '':
self._clear_marks()
return

start = time()
try:
output_lc, trend_lc = self.flatten(add_data=False)
except Exception as e:
Expand All @@ -253,10 +247,6 @@ def _live_update(self, event={}):
for mark in flattened_marks.values():
mark.update_ty(times.value, output_flux)

self.last_live_time = np.round(time() - start, 2)
if self.last_live_time > 0.3:
self.previews_temp_disable = True

def vue_apply(self, *args, **kwargs):
try:
self.flatten(add_data=True)
Expand Down
23 changes: 6 additions & 17 deletions lcviz/plugins/flatten/flatten.vue
Original file line number Diff line number Diff line change
Expand Up @@ -138,23 +138,12 @@
hint="Label for flux column."
></plugin-auto-label>

<v-alert v-if="previews_temp_disable && (show_live_preview || show_trend_preview)" type='warning' style="margin-left: -12px; margin-right: -12px">
Live-updating is temporarily disabled (last update took {{last_live_time}}s)
<v-row justify='center'>
<j-tooltip tooltipcontent='hide live trend and flattened previews (can be re-enabled from the settings section in the plugin).' span_style="width: 100%">
<v-btn style='width: 100%' @click="() => {show_live_preview = false; show_trend_preview = false}">
disable previews
</v-btn>
</j-tooltip>
</v-row>
<v-row justify='center'>
<j-tooltip tooltipcontent='manually update live-previews based on current plugin inputs.' span_style="width: 100%">
<v-btn style='width: 100%' @click="previews_temp_disable = false">
update preview
</v-btn>
</j-tooltip>
</v-row>
</v-alert>
<plugin-previews-temp-disabled
:previews_temp_disabled.sync="previews_temp_disabled"
:previews_last_time="previews_last_time"
:show_live_preview="show_live_preview || show_trend_preview"
@disable_previews="() => {show_live_preview=false; show_trend_preview=false}"
/>

<v-row justify="end">
<j-tooltip tooltipcontent="Flatten and select the new column as the adopted flux column">
Expand Down
3 changes: 2 additions & 1 deletion lcviz/plugins/viewer_creator/viewer_creator.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
__all__ = ['ViewerCreator']


@tool_registry('lcviz-viewer-creator')
# overwrite requires upstream changes, we can do without if we just lose the tooltip
@tool_registry('g-viewer-creator', overwrite=True)
class ViewerCreator(ViewerCreator):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Expand Down
28 changes: 16 additions & 12 deletions lcviz/state.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from echo import delay_callback
import numpy as np

from glue.viewers.scatter.state import ScatterViewerState
Expand All @@ -24,9 +23,10 @@ def _reset_att_limits(self, ax):
if not np.all(np.isfinite([ax_min, ax_max])): # pragma: no cover
return

with delay_callback(self, f'{ax}_min', f'{ax}_max'):
setattr(self, f'{ax}_min', ax_min)
setattr(self, f'{ax}_max', ax_max)
lim_helper = getattr(self, f'{ax}_lim_helper')
lim_helper.lower = ax_min
lim_helper.upper = ax_max
lim_helper.update_values()

def _reset_x_limits(self, *event):
self._reset_att_limits('x')
Expand All @@ -50,11 +50,15 @@ def reset_limits(self, *event):
y_min = min(y_min, np.nanmin(y_data))
y_max = max(y_max, np.nanmax(y_data))

with delay_callback(self, 'x_min', 'x_max', 'y_min', 'y_max'):
self.x_min = x_min
self.x_max = x_max
self.y_min = y_min
self.y_max = y_max
# We need to adjust the limits in here to avoid triggering all
# the update events then changing the limits again.
self._adjust_limits_aspect()
x_lim_helper = getattr(self, 'x_lim_helper')
x_lim_helper.lower = x_min
x_lim_helper.upper = x_max

y_lim_helper = getattr(self, 'y_lim_helper')
y_lim_helper.lower = y_min
y_lim_helper.upper = y_max

x_lim_helper.update_values()
y_lim_helper.update_values()

self._adjust_limits_aspect()
Loading

0 comments on commit f3edb89

Please sign in to comment.