Указание значения по умолчанию в виджетах, созданных pyviz hvplot

У меня есть набор данных 4D, и hvplot прекрасно генерирует виджеты для размеров, которые я указал в groupby:

import xarray as xr

ds = xr.open_dataset('http://gamone.whoi.edu/thredds/dodsC/coawst_4/use/fmrc/coawsthvplotuse_best.ncd')

rho_vars = ['salt','temp']

from cartopy import crs as ccrs
import hvplot.xarray
import holoviews as hv
from geoviews import tile_sources as gvts
import panel as pn

var_select = pn.widgets.Select(name='Variables:', options=rho_vars, 
                               value='temp')

crs = ccrs.PlateCarree()

def plot(var=None):
    base_map = gvts.OSM
    var = var or var_select.value
    mesh = ds[var][-24:,:,:].hvplot.quadmesh(x='lon_rho', y='lat_rho', rasterize=True, title=var,
                                    width=600, height=400, crs=crs,
                                    groupby=list(ds[var].dims[:-2]), cmap='jet')
    overlay = (base_map * mesh.opts(alpha=0.7)).opts(active_tools=['wheel_zoom', 'pan'])
    widgets = {dim: pn.widgets.Select for dim in ds[var].dims[:-2]}
    return pn.holoviews.HoloViews(overlay, widgets=widgets).layout

def on_var_select(event):
    var = event.obj.value
    dashboard[-1] = plot(var=var)

var_select.param.watch(on_var_select, parameter_names=['value']);

dashboard = pn.Column(var_select, plot(var_select.value))

который производит:

введите здесь описание изображения

Однако, хотя для hvplot по умолчанию используется первое значение options OrderedDict, я хотел бы по умолчанию использовать последнее значение.

Если я посмотрю на элементы панели инструментов:

print(dashboard)

Column
    [0] Select(name='Variables:', options=OrderedDict([('salt', ...]), value='temp')
    [1] Row
        [0] HoloViews(DynamicMap, widgets={'time': <class 'panel.wid...})
        [1] Column
            [0] Select(name='Forecast time f..., options=OrderedDict([('2019-03-09 ...]), value=numpy.datetime64('2019-03-...)
            [1] Select(name='S-coordinate a..., options=OrderedDict([('-0.96875', ...]), value=-0.96875)

Я вижу, что могу указать значение виджета Select post facto, например:

dashboard[1][1][1].value = next(reversed(dashboard[1][1][1].options.values())) 

и это действительно работает:

введите здесь описание изображения

Однако я хотел бы создать отдельную панель инструментов, которая по умолчанию принимает последнее значение, когда пользователь выбирает новую переменную. В текущем коде, когда выбирается новая переменная, значение по умолчанию, к сожалению, снова устанавливается на первое значение.

Есть ли способ встроить мой код post facto для выбора последнего значения в мою функцию построения графика или есть другой лучший подход для этого?

Полный блокнот здесь.


person Rich Signell    schedule 10.03.2019    source источник


Ответы (2)


Если я правильно понимаю ваш вопрос, аргумент "поля" to hvplot может это сделать.

person Timothy W. Hilton    schedule 15.05.2020

Как вы можете видеть, print(dashboard) у вас есть значение по умолчанию для виджетов.



Column
    [0] Select(name='Variables:', options=OrderedDict([('salt', ...]), value='temp')
    [1] Row
        [0] HoloViews(DynamicMap, widgets={'time': <class 'panel.wid...})
        [1] Column
            [0] Select(name='Forecast time f..., options=OrderedDict([('2019-03-09 ...]), value=numpy.datetime64('2019-03-...)
            [1] Select(name='S-coordinate a..., options=OrderedDict([('-0.96875', ...]), value=-0.96875)

Здесь значение по умолчанию для второго виджета -0.96875.

Я бы поработал над этой строкой widgets = {dim: pn.widgets.Select for dim in ds[var].dims[:-2]}, чтобы установить значение по умолчанию.

default_value = [...,...]
widgets = {dim: pn.widgets.Select(value=default_val[dim]) for dim in ds[var].dims[:-2]}
person Thomas PEDOT    schedule 12.03.2019
comment
Томас, это кажется правильным путем, но когда я указываю Select(value=, все остальные параметры, такие как Select(name=, options=, теряются. Это расстраивает! - person Rich Signell; 13.03.2019
comment
Стоит открыть вопрос для этого на панели, мы должны подумать о том, чтобы найти хороший способ указать это. Я не уверен, что изменение виджетов, созданных пользователем, было бы лучшим подходом, даже если бы это было удобно в этом случае. - person philippjfr; 13.03.2019