Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best way to change the widget type in an hvplot/holoviews/panel object?

Using the functionality in pyviz, it's easy to generate an hvplot/panel interactive dashboard for a gridded xarray dataset, like this air temperature data example:

import xarray as xr
import hvplot.xarray
import panel as pn

airtemps = xr.tutorial.load_dataset('air_temperature')
atemp = airtemps.air[:10,:,:]
mesh = atemp.hvplot(groupby='time')
row = pn.Row(mesh)
display(row)

which automatically creates a slider for the time dimension:

enter image description here

If I take a look at the object created:

print(row)

I can see that a DiscreteSlider widget was created:

Row
    [0] Row
        [0] HoloViews(DynamicMap)
        [1] WidgetBox
            [0] DiscreteSlider(name='Time', options=OrderedDict([('2013-01-01 ...]), value=numpy.datetime64('2013-01-...)

What is the best way to replace the DiscreteSlider widget with a drop down menu Select widget?

like image 952
Rich Signell Avatar asked Feb 27 '19 17:02

Rich Signell


1 Answers

To understand how to customize the display output of different types you have to understand how panel transform the objects that you give it into the objects that you see when displaying the pprint output. Specifically, internally panel will call the pn.panel function which tries to find the most appropriate Pane object to render what you gave it. In this case that is the HoloViews pane which is responsible for generating the widgets and for rendering the actual plot. In other words this code:

row = pn.Row(mesh)

is actually equivalent to:

row = pn.Row(pn.panel(mesh))

which in turn is equivalent to:

row = pn.Row(pn.holoviews.HoloViews(mesh).layout)

Once you are at the level of the actual Pane used to render the object you will be able to see the parameters available to customize the visual representation of the object. In the case of the HoloViews pane it offers a widgets parameter which allows supplying widget classes or instances as overrides for each of the dimensions in the object you are displaying. In your case you therefore want to do something like this:

pn.holoviews.HoloViews(mesh, widgets={'time': pn.widgets.Select}).layout

or less explicitly:

pn.panel(mesh, widgets={'time': pn.widgets.Select})

select_widget

like image 103
philippjfr Avatar answered Oct 22 '22 00:10

philippjfr