Skip to main content

Formats multipanel figures

Project description

figrid

A wrapper for the matplotlib gridspec function. Designed to make it easy to place axes on a pre-defined grid on a figure canvas. For example, maybe you want to lay out axes like this:

Example Layout

try it out in colab

Open In Colab

how it works

The fundamental function to use is place_axes_on_grid. This will generate an evenly spaced 100x100 grid on the desired figure canvas. You can then specify how much of the figure canvas a given axis (or set of axes) will span.

what it's good for

Maybe it's just me, but I've always found matplotlib's gridspec function to be confusing. And simple NxM grids with the subplots function can be too limiting. This makes it easy to place any number of axes at arbitrary locations on a figure. It's handy for making figures for publication.

a sample workflow

  1. Make some functions to generate the various subplots you want to display on a figure. Those functions should take an axis handle as an input.
  2. Define a figure canvas of the desired size.
  3. Define your axes, specifying their locations using figrid.place_axes_on_grid() (a dictionary is a useful data structure for storing your axis handles).
  4. Call your plotting functions with the axes as inputs.
  5. Add some axis labels using figrid.add_labels() that you can refer to from your figure legend.

installation:

pip install figrid

For development installation with testing dependencies:

pip install -e ".[dev]"

syntax

figrid.place_axes_on_grid takes the following inputs:

  • fig - the figure handle on which the axis will be placed
  • xspan - a two-element list or tuple defining the left and right edges of the axis, respectively. Numbers should be floats ranging from 0 to 1 and will be rounded to 2 decimal places.
  • yspan - a two-element list or tuple defining the top and bottom edges of the axis, respectively. Numbers should be floats ranging from 0 to 1 and will be rounded to 2 decimal places.
  • dim - a two-element tuple defining the number of rows/columns of the axis. Default = [1, 1], giving a single axis.
  • hspace = a float defining the horizontal space between subplots (if dim is specified)
  • vspace = a float defining the vertical space between subplots (if dim is specified)

sample use:

some imports:

# import the package as fg
import figrid as fg

# import example figure code
import example_figures

# import maptlotlib
import matplotlib.pyplot as plt

define a function to lay out the axes on a figure

# define function to set up figure and axes
def make_fig_ax():
    fig = plt.figure(figsize=(11,8.5))
    ax = {
        'panel_A': fg.place_axes_on_grid(fig, xspan=[0.05, 0.3], yspan=[0.05, 0.45]),
        'panel_B': fg.place_axes_on_grid(fig, xspan=[0.4, 1], yspan=[0.05, 0.45], dim=[3, 1], hspace=0.4),
        'panel_C': fg.place_axes_on_grid(fig, xspan=[0.05, 0.4], yspan=[0.57, 1]),
        'panel_D': fg.place_axes_on_grid(fig, xspan=[0.5, 1], yspan=[0.57, 1])
    }
    
    return fig, ax

make the figure

# call function to make figure and axes
fig, ax = make_fig_ax()

# call individual plotting functions, with axes as inputs
example_figures.heatmap(ax['panel_A'])
example_figures.sinusoids(ax['panel_B'])
example_figures.violins(ax['panel_C'])
example_figures.scatterplot(ax['panel_D'])

add some labels

labels = [
    {'label_text':'A', 'xpos':0,    'ypos':0.05, 'fontsize':20, 'weight': 'bold', 'ha': 'right', 'va': 'bottom'},
    {'label_text':'B', 'xpos':0.37, 'ypos':0.05, 'fontsize':20, 'weight': 'bold', 'ha': 'right', 'va': 'bottom'},
    {'label_text':'C', 'xpos':0,    'ypos':0.55, 'fontsize':20, 'weight': 'bold', 'ha': 'right', 'va': 'bottom'},
    {'label_text':'D', 'xpos':0.45, 'ypos':0.55, 'fontsize':20, 'weight': 'bold', 'ha': 'right', 'va': 'bottom'},
]
fg.add_labels(fig, labels)

Then we have this:

Example Figure

development and testing

Tests

For development, install with testing dependencies:

pip install -e ".[dev]"

To set up pre-commit hooks for automatic code formatting:

pre-commit install

This will automatically run black (code formatter) and flake8 (linter) on your commits.

To run the tests:

pytest

To run tests with coverage reporting:

pytest --cov=figrid --cov-report=term-missing

To manually format code:

black .

To manually check code style:

flake8 .

Tests and code quality checks are automatically run on push and pull request to the main branch using GitHub Actions.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

figrid-0.1.7.tar.gz (8.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

figrid-0.1.7-py3-none-any.whl (7.1 kB view details)

Uploaded Python 3

File details

Details for the file figrid-0.1.7.tar.gz.

File metadata

  • Download URL: figrid-0.1.7.tar.gz
  • Upload date:
  • Size: 8.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for figrid-0.1.7.tar.gz
Algorithm Hash digest
SHA256 aec44525dd0e226f82f06a2b6b79ec04a0610bdcb3f3d3bca407e211208fa122
MD5 2d946821529b2f8c2d720047f1d563b7
BLAKE2b-256 721622db16b7a23e9160bb6005fcc38d038fa53b02fc45600b8884d67369fae7

See more details on using hashes here.

File details

Details for the file figrid-0.1.7-py3-none-any.whl.

File metadata

  • Download URL: figrid-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 7.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.2

File hashes

Hashes for figrid-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 db613a90ac0d482902d3e8e069e5ce2ac961e6f7e1e6a13c1a8fe3ae2b86a5e8
MD5 a3b886ffd61ffe3e127a16db382232f8
BLAKE2b-256 0171fe939717bfd85abdaa5c7f6d03d62455af94a338451fb9a176b67061b5a9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page