Visualisation of direction-dependent phenomena

A physics experiment I had worked with showed effects depending on the direction of change of a independent variable affecting the system. To compare measured data under a condition of either negative or positive change of the independent variable x, the measured data y will need to be plotted with some style indicating this direction information.
I mainly use xarray to store a number of dimensions such as voltage, current, repeats and direction.
Holoviews offer a number of ways to do visualize the data with direction indications.

I went with obj.apply to apply a function that modified the opts of the obj.

def compute_marker(scatter):
    direction_markers = {
        'positive': 'circle',
        'negative': 'triangle'
    }
    sel_data = scatter.data
    direction = sel_data['direction'].iloc[0]
    return scatter.opts(marker=direction_markers[direction])
obj = obj.apply(compute_marker)

The full code making use of the function

import numpy as np
import pandas as pd
import xarray as xr
import scipy.stats as stats

import holoviews as hv
from holoviews import opts
import hvplot.pandas

hv.extension('bokeh')

# Normal distribution parameters
variance = 1
sigma = np.sqrt(variance)
mu = xr.DataArray([-1, 1], coords={'direction': ['negative', 'positive']}, dims='direction')

# Independent variable
x = xr.DataArray(np.linspace(0, 1, len(idx)), dims='x', name='x')
x = (x * sigma * 2 - sigma) * 3

# Generate normal distribution
y = xr.apply_ufunc(stats.norm.pdf, x, mu, sigma)

# Add noise
noise = xr.DataArray(np.random.randn(len(V), len(I), len(direction), len(x)),
                 coords=[V, I, direction, x],
                 name='noise')
y = y + noise * 0.03
y.name = 'y'

def compute_marker(scatter):
    direction_markers = {
        'positive': 'circle',
        'negative': 'triangle'
    }
    sel_data = scatter.data
    direction = sel_data['direction'].iloc[0]
    return scatter.opts(marker=direction_markers[direction])

plot = (y.to_dataframe()
        .hvplot.scatter(x='x', y='y', groupby=['V', 'I', 'direction'], dynamic=False)
        .apply(compute_marker))
plot

However, with the bokeh backend I find that the plot is not rendered properly in either classic jupyter notebook or jupyterlab when I attempt to overlay the direction dimension plot.overlay('direction'). The plot do not display at all. With the matplotlib backend this issue does not arise.

I have created this thread to explore issues I have encountered for this situation and create individual GitHub issues to tackle underlying issues.

Additional case that display only the bokeh toolbar

plot.overlay('I').layout('direction')

Reported in Github issue with JS errors

Probably related to legends taking up too much space. Will look into it.