Spikes

Download this notebook from GitHub (right-click to download).


Title
Spikes Element
Dependencies
Bokeh
Backends
Bokeh
Matplotlib
In [1]:
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:

In [2]:
xs = np.random.rand(50)
spikes = hv.Spikes(xs)
spikes.opts(line_alpha=0.4, spike_length=0.1)
Out[2]:

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:

In [3]:
ys = np.random.rand(50)
points = hv.Points((xs, ys))
spikes = hv.Spikes(xs)
points.opts(color='red') * spikes
Out[3]:

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:

In [4]:
spikes = hv.Spikes(np.random.rand(20, 2), 'Mass', 'Intensity')
spikes.opts(cmap='Reds', color='Intensity')
Out[4]:

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:

In [5]:
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))
Out[5]:

Finally, we may use Spikes to visualize marginal distributions as adjoined plots using the << adjoin operator:

In [6]:
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))
Out[6]:

For full documentation and the available style and plot options, use hv.help(hv.Spikes).


Download this notebook from GitHub (right-click to download).