Widget TimeSeries
Source code: https://github.com/the-virtual-brain/tvb-widgets
This is part of a Pypi release: https://pypi.org/project/tvb-widgets/
tvb-widgets is also already installed in the official image released for EBRAINS lab, where you can test it directly.
Purpose
It is a JupyterLab Widget intended for the visualization of brain signals represented as time series.
Backends
Starting with tvb-widgets 1.5.0, the TS widget comes in 2 forms, corresponding to the 2 different libraries (we called them backends) used for plotting: matplotlib and plotly. The matplotlib backend, build on top of the mne library, offers more advanced scientifical features, while the plotly backend has a more appealing look and moves faster when talking about the basic interactions.
Below you can see the TS widget with each backend option (first one using the matplotlib backend, second one using the plotly backend).
Inputs
Time series can be given as inputs in two forms:
- TVB TimeSeries datatype
- Numpy arrays
This widget supports 2D, 3D, and 4D arrays. In all three cases, there is a fixed shape that the TimeSeries widget expects:
- for 2D: (no_timepoints, no_channels)
- for 3D: (no_timepoints, state_variable/mode, no_channels)
- for 4D: (no_timepoints, state_variable, no_channels, mode)
* Note that the TVB TimeSeries datatype is always 4D and already has the expected shape.
Requirements and installation
Before installing the tvb-widgets library containing the TimeSeries widget, the following python libraries and Jupyter extensions should be installed:
- Libraries:
- mne >= 1.0
- matplotlib
- plotly == 5.14.0
- ipywidgets == 7.7.2
- ipympl >= 0.8.5
Extensions:
jupyter labextension install @jupyter-widgets/jupyterlab-manager
jupyter labextension install jupyter-matplotlib
jupyter labextension install jupyterlab-plotly
Then, to install the tvb-widgets library, just type:
pip install tvb-widgets
API usage
First, the correct matplotlib backend must be set, which enables the interaction with the TimeSeries widget, by running the following command:
%matplotlib widget
Then, simply import the plot_timeseries method, which gives you access to the TS widget:
from tvbwidgets.api import plot_timeseries
Assuming that the user has already created or imported a valid input, this is how the widget can be initialized and displayed (example below assumes that tsr is a TVB TimeSeries datatype):
backend = 'plotly' # change to 'matplotlib' to see the other TS widget
plot_timeseries(data=tsr, backend=backend)
After running the code from above into a Jupyter cell, you should see the TS widget corresponding to the backend you selected.
1. TS Widget with matplotlib and mne
As it was already mentioned, the matplotlib widget offers more advanced scientifical fearures. In the video below, you can see some of the functionalities that this backend provides, like: increasing/decreasing signal amplitude, selecting/deselecting certain signals, selecting different dimensions (state variable/mode) from the input data, navigating through the timeline, etc.
2. TS Widget with plotly
Starting with tvb-widgets version 1.5.0, we introduced a second TS Widget, which uses the plotly.py library to create the interactive plot. Below you can watch small tutorials on how to use and interact with this widget.
2.1. Basic controls of the plot
If you hover over a signal, a tooltip will appear where you can see the exact value from that point and the name of the channel you are hovering over. Next, you can zoom in, by dragging and creating an area inside the plot or from the plotly tools area and zoom out, from the same tools area. To come back to the original view, you can click the 'Reset axes' button (house icon) from the tools area.
To the right of the plot there is a legend, showing the channels which are plotted. The '[R]' notation means that the signal is resampled so that all of it can be viewed inside the plot. The '~20' notation means that 20 consecutive points are aggregated into a single point in the plot. As you zoom in in the plot, the number of aggregated points decreases. This is all done using the plotly-resampler package.
Moreover, clicking on a channel name from the legend will toggle its visibility inside the plot. This means that the signal corresponding to that channel is not removed, but just invisible in the plot. Double clicking on a channel from the legend will isolate it, meaning that will be the only visible channel in the plot and the rest of them will be hidden. Double clicking again will make all the channels visible again. If you wish to hide all the channels or make all of them visible, use the 'Hide All' and 'Show All' buttons.
2.2. Moving through the timeline and channels list
To move through the timeline or channels list, go to your cursor over the X (for timeline) and Y (for channels) axes and drag it to navigate.
2.3. Modify spacing between channels
To modify the spacing between the channels, go with your cursor over the beginning/end of the Y axis (where the channels list is) and drag it to the outside of the plot area. To decrease the spacing, drag your cursor to the inside of the plot area. To reset the spacing to the default values, click on the 'Reset axes' button (Home icon) from the plotly tools area.
2.4. Modify signal scaling
To modify the scaling (amplitude) of a signal, use the slider below the plot. To the right of the slider you will see the scaling factor, i.e. the number by which the signals are multiplied.
2.5. Channels and dimensions selection
To select which channels are plotted/removed from the plot (so not just visible/hidden), you can use the 'Channels' area to the right of the plot & legend. When you expend it, the first visible element is a 'Submit selection' button, which must be used every time a change is done in this Channels area.
Underneath this button there are a 'State variable' and a 'Mode' selection sections, which are mostly relevant when the input data (time series) has 3 or 4 dimensions.
Below are the 'Select all' and 'Unselect all' buttons, which will plot/remove all the signals in/from the plot.
Finally, below you can see a list of checkboxes, where each checkbox corresponds to one signal from the plot. Unchecking a checkbox for a signal will remove that signal from the plot.
Once again, always remember that for each selection, be it a dimension or a signal selection, you must use the 'Submit selection' button to see a change in the plot.