spylt
is a simple utility to back up the data necessary to reproduce a matplotlib
figure. Ever came back after weeks, months (years?) to a figure that you need to
slightly adjust, only to find out that you have no idea where you buried that piece of
code or that dataset that you need to generate this plot? That's a typical situation in
which spylt
would have helped. It provides a decorator for your plotting functions
that adds the functionality that upon saving the figure, a copy of all the following
metadata can be saved:
- The function or even the function's module code, as a
.py
file. - The values of all of the function's arguments, as
pickle
files. - The virtual environment definition, that is
pip
'srequirements.txt
orconda
'senvironment.yml
. - A
matplotlibrc
file, which can be useful in case you've modifiedrcParams
at runtime. - Other things? Please make your suggestions in the issue tracker!
Please bear in mind that spylt
should only be seen as a failsafe, it does not replace
good practices such as version control, saving intermediary results and figure metadata.
The simplest is to install with pip
:
pip install spylt
To install the latest development version from source (requires pip >= 19.0
):
pip install git+https://github.com/TLouf/spylt.git
To install an editable version for development, first clone from the repository (or your
own fork), and then use poetry
to install:
git clone https://github.com/TLouf/spylt.git
cd spylt
poetry install
There are three ways to utilise spylt
's functionality, presented in the following from
more to less recommended:
-
decorating the plotting function with
@spylling
from spylt import spylling @spylling(verbose=True) def plot(dataset, scatter_size=6, cmap='plasma'): """Function that creates your figure""" ... return ax
This method is aware of the defined function and its arguments, and can thus save both the function definition and the value of all its args and kwargs without you specifying anything:
>>> ax = plot(dataset, scatter_size=10) >>> ax.get_figure().savefig('fig.pdf') Saved figure: fig.pdf Saving backup data to: └── fig ├── plot.py ├── scatter_size.pickle ├── dataset.pickle ├── cmap.pickle └── matplotlibrc
The
savefig
call can be made outside or inside theplot
function, everything will be backed up as long as it is done on a figure instantiated inplot
(viaplt.figure
,plt.subplots
,plt.subplot_mosaic
, etc). -
plotting within a context defined by
SpyllingContext
from spylt import SpyllingContext with SpyllingContext(verbose=True): """Code that creates your figure""" ...
-
instantiating the
SpyllingFigure
classfrom spylt import SpyllingFigure fig, ax = plt.subplots(*args, FigureClass=SpyllingFigure, verbose=True) ...
In the two previous cases, you'll have to specify what data you want to save, and possibly the function definition:
>>> fig.savefig('fig.pdf', plot_fun=plot, data={'dataset': dataset})
Saved figure: fig.pdf
Saving backup data to:
└── fig
├── plot.py
├── dataset.pickle
└── matplotlibrc
If it can help you remember the name of the package in the future, it comes from the
idea of spilling data to disk, stylised as spylt
to be reminiscent of
matplotlib.pyplot
.