Source code for lib5c.plotters.extendable.extendable_figure
"""
Module for the ExtendableFigure base class.
"""
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from lib5c.util.system import check_outdir
[docs]class ExtendableFigure(object):
"""
Base class for figures that can interactively and sequentially tack on new
axes to themselves.
Uses a ``divider`` attribute obtained from
``mpl_toolkits.axes_grid1.make_axes_locatable()`` to add new axes to the
figure. Clients can call ``add_ax()`` to add a new axis.
All the axes in the ExtendableFigure can be accessed by name using a dict-
like interface: ``f[name]`` where ``f`` is the ExtendableFigure instance and
``name`` is the name of the axis. The ExtendableFigure starts out with one
axis already present, called 'root'.
Attributes
----------
axes : dict of matplotlib.axes.Axes
The collection of named Axes represented by this object.
fig : matplotlib.figure.Figure
The Figure instance this object represents.
divider : mpl_toolkits.axes_grid1.axes_divider.AxesDivider
This object serves as a coordinator for the allocation of new Axes to be
appended to this ExtendableFigure.
Examples
--------
>>> import numpy as np
>>> from lib5c.plotters.extendable.extendable_figure import ExtendableFigure
>>> xs = np.arange(0, 10)
>>> f = ExtendableFigure()
>>> f['root'].imshow(np.arange(100).reshape((10,10)))
<matplotlib.image.AxesImage object at ...>
>>> f.add_ax('sin')
<matplotlib.axes._axes.Axes object at ...>
>>> f['sin'].plot(xs, np.sin(xs))
[<matplotlib.lines.Line2D object at ...>]
>>> f.add_colorbar('root')
>>> f.save('test/extendablefigure.png')
"""
def __init__(self):
self.axes = {}
self.fig, self.axes['root'] = plt.subplots()
self.divider = make_axes_locatable(self.axes['root'])
def __getitem__(self, item):
return self.axes[item]
[docs] def add_ax(self, name, loc='bottom', size='10%', pad=0.1):
"""
Adds a new axis to this ExtendableFigure.
Parameters
----------
name : str
A name for the new axis. The axis will be accessible as
``f[new_ax_name]`` where ``f`` is this ExtendableFigure instance.
loc : {'top', 'bottom', 'left', 'right'}
Which side of the figure to add the new axis to.
size : str
The size of the new axis as a percentage of the main figure size.
Should be passed as a string ending in '%'.
pad : float
The padding to use between the existing parts of the figure and the
newly added axis.
Returns
-------
pyplot axis
The newly created axis.
"""
if name in self.axes:
raise ValueError('an axis with name %s already exists!' % name)
self.axes[name] = self.divider.append_axes(loc, size, pad)
return self.axes[name]
[docs] def add_colorbar(self, source_ax_name, loc='right', size='10%', pad=0.1,
new_ax_name='colorbar'):
"""
Adds a colorbar to the heatmap in a new axis.
Parameters
----------
source_ax_name : str
The name of the axis that this should be the colorbar for. This is
where matplotlib will look to find color information for the new
colorbar.
loc : {'top', 'bottom', 'left', 'right'}
Which side of the figure to add the new colorbar to.
size : str
The size of the new axis as a percentage of the main figure size.
Should be passed as a string ending in '%'.
pad : float
The padding to use between the existing parts of the figure and the
newly added axis.
new_ax_name : str
A name for the new axis. The axis will be accessible as
``f[new_ax_name]`` where ``f`` is this ExtendableFigure instance.
"""
self.add_ax(new_ax_name, loc, size, pad)
self.fig.colorbar(self.axes[source_ax_name].images[0],
cax=self.axes[new_ax_name])
[docs] def save(self, filename):
"""
Saves this ExtendableHeatmap to the disk as an image file.
Parameters
----------
filename : str
The filename to save the image to.
"""
check_outdir(filename)
self.fig.savefig(filename, dpi=800, bbox_inches='tight')
[docs] def close(self):
"""
Clears and closes the pyplot figure related to this ExtendableFigure.
"""
self.fig.clf()
plt.close(self.fig)