#python #holoviews #pyviz
#python #holoviews #pyviz
Вопрос:
У меня есть набор данных 4D, и hvplot
он прекрасно генерирует виджеты для измерений, которые я указал в groupby
:
import xarray as xr
ds = xr.open_dataset('http://gamone.whoi.edu/thredds/dodsC/coawst_4/use/fmrc/coawst_4_use_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
значение виджета постфактум следующим образом:
dashboard[1][1][1].value = next(reversed(dashboard[1][1][1].options.values()))
и это действительно работает:
Однако я хотел бы создать отдельную панель мониторинга, в которой по умолчанию используется последнее значение, когда пользователь выбирает новую переменную. В текущем коде при выборе новой переменной значение по умолчанию, к сожалению, снова устанавливается равным первому значению.
Есть ли способ встроить мой код post facto для выбора последнего значения в мою функцию plot, или есть другой лучший подход для достижения этой цели?
Ответ №1:
Если я правильно понимаю ваш вопрос, аргумент ‘fields’ для hvplot может это сделать.
Ответ №2:
Как вы можете видеть, когда у 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]}
Комментарии:
1. Томас, это кажется правильным путем, но когда я указываю,
Select(value=
все другие параметры, такие какSelect(name=, options=
, теряются. Это расстраивает!2. Стоит открыть проблему для этого в panel, нам следует подумать о том, чтобы найти хороший способ указать это. Я не уверен, что изменение виджетов, созданных пользователем, было бы лучшим подходом, даже если это было бы удобно в данном случае.