import numpy as np
import holoviews as hv
hv.extension('matplotlib')
Spikes represent any number of horizontal or vertical line segments with fixed or variable heights. There are a number of different uses for this type. First of all, they may be used as a rugplot to give an overview of a one-dimensional distribution. They may also be useful in more domain-specific cases, such as visualizing spike trains for neurophysiology or spectrograms in physics and chemistry applications.
In the simplest case, a Spikes object represents coordinates in a 1D distribution:
%%opts Spikes (alpha=0.4) [spike_length=0.1]
xs = np.random.rand(50)
hv.Spikes(xs)
We can overlay Spikes
on top of other Chart
elements (such as Points
or Curve
) if we want to draw attention to where samples are along the x-axis:
%%opts Points (color='red')
ys = np.random.rand(50)
hv.Points((xs, ys)) * hv.Spikes(xs)
When supplying a second dimension to the Spikes
element as a value dimensions, these additional values will be mapped onto the line height. Optionally, you may also supply a colormap cmap
and color_index
to map the value dimensions to a suitable set of colors. This way we can, for example, plot a mass spectrogram:
%%opts Spikes [color_index='Intensity'] (cmap='Reds')
hv.Spikes(np.random.rand(20, 2), 'Mass', 'Intensity')
Another possibility is to draw a number of spike trains representing the firing of neurons, of the sort that are commonly encountered in neuroscience. Here we generate 10 separate random spike trains and distribute them evenly across the space by setting their position
. By declaring some yticks
, each spike train can be labeled individually:
%%opts Spikes [spike_length=0.1] NdOverlay [show_legend=False]
hv.NdOverlay({i: hv.Spikes(np.random.randint(0, 100, 10), 'Time').options(position=0.1*i)
for i in range(10)}).options(yticks=[((i+1)*0.1-0.05, i) for i in range(10)])
Finally, we may use Spikes
to visualize marginal distributions as adjoined plots using the <<
adjoin operator:
%%opts Spikes (alpha=0.2)
points = hv.Points(np.random.randn(500, 2))
points << hv.Spikes(points['y']) << hv.Spikes(points['x'])
For full documentation and the available style and plot options, use hv.help(hv.Spikes).