Skip to main content

Matplotlib based figure panel builder

Project description

mpl-panel-builder logo

Create publication-quality scientific figure panels with a consistent layout

Ruff Lint Pyright Type Check Unit Tests

Python PyPI version License: MIT

mpl-panel-builder helps you compose matplotlib-based publication-quality scientific figure panels with precise and repeatable layouts. The shared precise layout lets you align panels perfectly into complete figures by simply stacking them vertically or horizontally. Included example scripts illustrate how to create panels and how these can be combined with TikZ to obtain a complete figure creation pipeline that is fully reproducible and under version control in Git.

Features

  • 📏 Precise Layout Control: Define panel dimensions in centimeters for exact sizing
  • 🎨 Consistent Styling: Maintain uniform fonts, margins, and aesthetics across panels
  • 🔄 Reproducible Workflow: Version-controlled figure creation pipeline
  • 📊 Flexible Panel Composition: Easy vertical and horizontal stacking of panels
  • 🎯 Publication-Ready: Optimized for scientific publication requirements

Requirements

  • Python 3.11 or higher
  • Matplotlib
  • TikZ (optional, for complete figure assembly)
  • Poppler (optional, for converting PDFs to png)

Installation

From PyPI (recommended)

To use mpl-panel-builder in your project, install it from PyPI:

pip install mpl-panel-builder

From source (for examples and development)

If you want to explore the examples or contribute to the project, follow these steps to install from source:

# clone repository
$ git clone https://github.com/NoviaIntSysGroup/mpl-panel-builder.git
$ cd mpl-panel-builder

# install package and development dependencies
$ uv sync

Basic usage

Panels are created using simple function calls. You first configure your panel with mpb.configure(config_dict) using a config dict specifying the panel's dimensions, margins, and styling (Matplotlib rcParams). Next, the styling is set via mpb.set_style_rc(), and the figure and axes are created via mpb.create_panel(). A minimal example is given below:

import matplotlib.pyplot as plt
import mpl_panel_builder as mpb

# mpl_panel_builder configuration
mpb_config = {
    "panel": {
        "dimensions": {
            "width_cm": 6.0,
            "height_cm": 5.0,
        },
        "margins": {
            "top_cm": 0.5,
            "bottom_cm": 1.5,
            "left_cm": 1.5,
            "right_cm": 0.5,
        },
    },
    # Styling via rcParams
    "style": {
        "rc_params": {
            "font.size": 8,
        }
    }
}

# Apply the config and style, and create your figure and axes
mpb.configure(mpb_config)
mpb.set_rc_style()
fig, axs = mpb.create_panel(rows=1, cols=1)  # or mpb.create_stacked_panel(rows=1, cols=1)
ax = axs[0][0]

# Add your plotting code here
ax.plot([1, 2, 3], [1, 2, 3])
ax.set_xlabel("X axis")
ax.set_ylabel("Y axis")

# Save the panel
mpb.save_panel(fig, "my_panel")

Configuration Options

The configuration dict supports four main sections:

  • panel: Core settings for dimensions, margins, and axes separation.
  • style: Styling via rcParams.
  • features: Settings for additional features (e.g., scale bars and color bars).
  • output: Settings for saving panels (format and DPI).

You can view all available configuration options by running:

import mpl_panel_builder as mpb

# Print template configuration to see all available options
mpb.print_template_config()

Configuration Override

For advanced configuration scenarios, the configure() function also supports special operators to modify the existing configuration:

import mpl_panel_builder as mpb

base_config = {
    'panel': {
        'dimensions': {'width_cm': 10, 'height_cm': 8},
        'margins': {'left_cm': 1, 'right_cm': 1}
    }
}

# Use special operators for relative updates
updates = {
    'panel': {
        'dimensions': {'width_cm': '+=5'},     # Add 5 to current value
        'margins': {'left_cm': '*1.5'}        # Multiply by 1.5
    }
}

# First configure with base config
mpb.configure(base_config)

# Then apply updates using special operators
mpb.configure(updates)
# Result: width_cm becomes 15, left_cm becomes 1.5

Supported operators:

  • "+=X": Add X to current value
  • "-=X": Subtract X from current value
  • "*X": Multiply current value by X
  • "=X": Set value to X

Extra Features

Extra features include wrappers for systematically aligning scale bars, colorbars, and annotations. In addition, the package includes a feature for placing a grid over the whole panel to verify that all elements have their intended position.

from mpl_panel_builder.features import (
    draw_x_scale_bar, draw_y_scale_bar, 
    add_colorbar, add_annotation, add_label, draw_gridlines
)

# Add scale bars
draw_x_scale_bar(ax, length=1.0, label="1 cm")
draw_y_scale_bar(ax, length=0.5, label="0.5 cm")

# Add colorbar, mappable could e.g. be
# mappable = ax.scatter()
# mappable = ax.imshow()
add_colorbar(ax, mappable, position="right")

# Add annotations
add_annotation(ax, "Text", loc="northwest")

# Add labels
add_label(ax, "a")

# Add debug gridlines
draw_gridlines(fig)

Examples

The repository includes example scripts that demonstrate both panel creation and how to programmatically assemble panels into complete figures using additional tools (TikZ and Poppler). All generated files are stored under outputs/.

Example 1: Minimal example

# Create panels only
uv run python examples/ex_1_minimal_example/create_panels.py

Example 2: Config key visualization

# Create panels only
uv run python examples/ex_2_config_visualization/create_panels.py
# Create complete figure, requires TikZ and Poppler
uv run python examples/ex_2_config_visualization/create_figure.py

Example 3: All features demonstration

# Create panels demonstrating all available features
uv run python examples/ex_3_debug_all_features/create_panels.py

Repository layout

├── src/mpl_panel_builder/    # Library code
├── examples/                 # Demo scripts and LaTeX templates
├── outputs/                  # Generated content
├── tests/                    # Test suite

Development

Install development requirements and set up the hooks:

uv sync
uv run pre-commit install --hook-type pre-commit --hook-type pre-push

Before committing or pushing run:

uv run ruff check .
uv run pyright
uv run pytest

Contributing

We welcome contributions! Please follow these steps:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes
  4. Run the test suite (uv run pytest)
  5. Commit your changes (git commit -m 'Add amazing feature')
  6. Push to the branch (git push origin feature/amazing-feature)
  7. Open a Pull Request

Please ensure your code follows our style guidelines:

  • Use Ruff for code formatting and linting
  • Use Pyright for type checking
  • Follow Google's Python style guide for docstrings
  • Include type annotations for all functions
  • Add tests for new functionality

License

This project is released under the MIT License.

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

mpl_panel_builder-0.6.2.tar.gz (132.6 kB view details)

Uploaded Source

Built Distribution

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

mpl_panel_builder-0.6.2-py3-none-any.whl (20.9 kB view details)

Uploaded Python 3

File details

Details for the file mpl_panel_builder-0.6.2.tar.gz.

File metadata

  • Download URL: mpl_panel_builder-0.6.2.tar.gz
  • Upload date:
  • Size: 132.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.4

File hashes

Hashes for mpl_panel_builder-0.6.2.tar.gz
Algorithm Hash digest
SHA256 4397683212f535cac6de2c117b07703c9cef82e9e5c057dd0a15bd8494dd595b
MD5 453a1a7e29195827accc6fdef356de13
BLAKE2b-256 a9ada3e28678437fdccebd55926ae9dcd110288d3cd29547d1604408769e917d

See more details on using hashes here.

File details

Details for the file mpl_panel_builder-0.6.2-py3-none-any.whl.

File metadata

File hashes

Hashes for mpl_panel_builder-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 887b115136f07d1a33d42203c9278fbd4f8eb90261269d9f7179acfcf8317f84
MD5 4b34dc887dbf7206953a92100a0f45b2
BLAKE2b-256 1edd88e79790e859c605679e0a91a32a593372b13d61ad6f77db6b4bbcc6b1c4

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