Holoviews to HoloViews¶
Interacting between HoloViews objects.
Pros:
Dynamically generate values
All in Python
Cons:
Interactivity may not be retained when saved
May require backend server
References:
Tap for update plot¶
Server required.
[7]:
import xarray as xr
import holoviews as hv
hv.extension("bokeh")
ds = xr.tutorial.open_dataset("air_temperature").isel(time=slice(0, 3))
coord_stream = hv.streams.Tap(x=-88 + 360, y=40)
time_stream = hv.streams.Tap(x=ds["time"].values[0])
def create_geomap(x, y):
ds_sel = ds.sel(time=x, method="nearest")
return hv.Image(ds_sel, ["lon", "lat"], ["air"]).opts(
"Image", title=str(x)[:16], tools=["tap", "hover"])
def create_timeseries(x, y):
ds_sel = ds.sel(lon=x, lat=y, method="nearest")
return hv.Curve(ds_sel, ["time"], ["air"]).opts(
"Curve", title=f"{x:.1f}, {y:.1f}", framewise=True, tools=["tap", "hover"])
def create_point(x, y):
return hv.Points((x, y)).opts("Points", color="red", marker="x", size=25)
def create_vline(x, y):
return hv.VLine(x).opts("VLine", color="red")
# create base plots
geomap = hv.DynamicMap(create_geomap, streams=[time_stream])
timeseries = hv.DynamicMap(create_timeseries, streams=[coord_stream])
# link source
coord_stream.source = geomap
time_stream.source = timeseries
# create annotations
coord_point = hv.DynamicMap(create_point, streams=[coord_stream])
time_vline = hv.DynamicMap(create_vline, streams=[time_stream])
# overlay + layout
layout = geomap * coord_point + timeseries * time_vline
[3]:
import panel as pn
pn.extension()
pn.pane.GIF("tap_for_update_plot.gif")
[3]:
Pointer Y for cross section (Hovmueller)¶
[4]:
import xarray as xr
import holoviews as hv
hv.extension("bokeh")
ds = xr.tutorial.open_dataset("air_temperature").isel(time=slice(0, 5))
def create_xsection(y):
ds_sel = ds.sel(lat=y, method="nearest")
return hv.Image(ds_sel, ["lon", "time"], ["air"])
def create_hline(y):
return hv.HLine(y).opts("HLine", color="red")
geomap = hv.Image(ds.isel(time=0), ["lon", "lat"], ["air"]).opts(
"Image", tools=["hover"])
lat_stream = hv.streams.PointerY(y=40, source=geomap)
xsection = hv.DynamicMap(create_xsection, streams=[lat_stream])
# create annotations
lat_hline = hv.DynamicMap(create_hline, streams=[lat_stream])
# overlay + layout
layout = geomap * lat_hline + xsection
[5]:
import panel as pn
pn.extension()
pn.pane.GIF("pointer_y_for_cross_section.gif")
[5]: