Spikes¶
Download this notebook from GitHub (right-click to download).
- Title
- Spikes Element
- Dependencies
- Bokeh
- Backends
- Bokeh
- Matplotlib
import numpy as np
import holoviews as hv
from holoviews import opts
hv.extension('bokeh')
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. Here we set the alpha of the spikes to 0.4
using line_alpha
and the height of the spikes to 0.1
using spike_length
:
xs = np.random.rand(50)
spikes = hv.Spikes(xs)
spikes.opts(line_alpha=0.4, spike_length=0.1)
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:
ys = np.random.rand(50)
points = hv.Points((xs, ys))
spikes = hv.Spikes(xs)
points.opts(color='red') * spikes
When supplying a second dimension to the Spikes
element as a value dimension, these additional values will be mapped onto the line height. Optionally, it is also possible to map dimensions to style options. This way we can, for example, plot a mass spectrogram:
spikes = hv.Spikes(np.random.rand(20, 2), 'Mass', 'Intensity')
spikes.opts(cmap='Reds', color='Intensity')
Another possibility is to draw a set of Spikes offset by a position, which can be useful for plotting discrete events like neurons firing. 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:
overlay = hv.NdOverlay({i: hv.Spikes(np.random.randint(0, 100, 10), kdims='Time').opts(position=0.1*i)
for i in range(10)}).opts(yticks=[((i+1)*0.1-0.05, i) for i in range(10)])
overlay.opts(
opts.Spikes(spike_length=0.1),
opts.NdOverlay(show_legend=False))
Finally, we may use Spikes
to visualize marginal distributions as adjoined plots using the <<
adjoin operator:
points = hv.Points(np.random.randn(500, 2))
composition = points << hv.Spikes(points['y']) << hv.Spikes(points['x'])
composition.opts(
opts.Spikes(line_alpha=0.2))
For full documentation and the available style and plot options, use hv.help(hv.Spikes).
Download this notebook from GitHub (right-click to download).