{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
\n", "
Title
Spikes Element
\n", "
Dependencies
Bokeh
\n", "
Backends
Bokeh
Matplotlib
\n", "
\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import holoviews as hv\n", "from holoviews import opts\n", "hv.extension('bokeh')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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.\n", "\n", "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`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xs = np.random.rand(50)\n", "spikes = hv.Spikes(xs)\n", "spikes.opts(line_alpha=0.4, spike_length=0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ys = np.random.rand(50)\n", "points = hv.Points((xs, ys))\n", "spikes = hv.Spikes(xs)\n", "points.opts(color='red') * spikes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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](https://en.wikipedia.org/wiki/Mass_spectrometry):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "spikes = hv.Spikes(np.random.rand(20, 2), 'Mass', 'Intensity')\n", "spikes.opts(cmap='Reds', color='Intensity')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "overlay = hv.NdOverlay({i: hv.Spikes(np.random.randint(0, 100, 10), kdims='Time').opts(position=0.1*i)\n", " for i in range(10)}).opts(yticks=[((i+1)*0.1-0.05, i) for i in range(10)])\n", "overlay.opts(\n", " opts.Spikes(spike_length=0.1),\n", " opts.NdOverlay(show_legend=False))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we may use ``Spikes`` to visualize marginal distributions as adjoined plots using the ``<<`` adjoin operator:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "points = hv.Points(np.random.randn(500, 2))\n", "composition = points << hv.Spikes(points['y']) << hv.Spikes(points['x'])\n", "composition.opts(\n", " opts.Spikes(line_alpha=0.2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For full documentation and the available style and plot options, use ``hv.help(hv.Spikes).``" ] } ], "metadata": { "language_info": { "name": "python", "pygments_lexer": "ipython3" } }, "nbformat": 4, "nbformat_minor": 2 }