Spikes

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

In [2]:
%%opts Spikes (alpha=0.4) [spike_length=0.1]
xs = np.random.rand(50)
hv.Spikes(xs)
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]:
%%opts Points (color='red')
ys = np.random.rand(50)
hv.Points((xs, ys)) * hv.Spikes(xs)
Out[3]:

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 :

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

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:

In [5]:
%%opts Spikes [spike_length=0.1] NdOverlay [show_legend=False]
hv.NdOverlay({i: hv.Spikes(np.random.randint(0, 100, 10), kdims=['Time'])(plot=dict(position=0.1*i))
              for i in range(10)})(plot=dict(yticks=[((i+1)*0.1-0.05, i) for i in range(10)]))
Out[5]:

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

In [6]:
%%opts Spikes (alpha=0.2)
points = hv.Points(np.random.randn(500, 2))
points << hv.Spikes(points['y']) << hv.Spikes(points['x'])
Out[6]:

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