Skip to main content

Routines to get a sane default configuration for production quality plots.

Project description

cosmoplots

Routines to get a sane default configuration for production quality plots. Used by complex systems modelling group at UiT.

Installation

The package is published to PyPI and can be installed with

pip install cosmoplots

If you want the development version you must first clone the repo to your local machine, then install the project and its dependencies with poetry:

git clone https://github.com/uit-cosmo/cosmoplots.git
cd cosmoplots
poetry install

Usage

Set your rcparams before plotting in your code, for example:

import matplotlib.pyplot as plt
import cosmoplots
# If you only want the default style
plt.style.use(["cosmoplots.default"])

Muliple subfigures

To make a figure with multiple rows or columns, use cosmoplots.figure_multiple_rows_columns. By default, the labels are $\mathrm{(a)}$, $\mathrm{(b)}$, $\mathrm{(c)}$, ..., but they may be replaced using the labels argument.

import matplotlib.pyplot as plt
import cosmoplots
plt.style.use(["cosmoplots.default"])

import numpy as np

rows = 1
columns = 2

fig, ax = cosmoplots.figure_multiple_rows_columns(rows, columns)
a = np.linspace(-3,3,100)
for i in range(rows*columns):
    ax[i].set_xlabel("X Axis")
    ax[i].set_ylabel("Y Axis")
    ax[i].plot(i*a)
plt.show()

multifig

change_log_axis_base

import matplotlib.pyplot as plt
import cosmoplots
plt.style.use(["cosmoplots.default"])
import numpy as np

a = np.exp(np.linspace(-3, 1, 100))

# Plotting
fig = plt.figure()
ax1 = plt.gca()
ax1.set_xlabel("X Axis")
ax1.set_ylabel("Y Axis")
base = 2  # Default is 10, but 2 works equally well
# Do plotting ...
ax1.semilogx(a)
# It is recommended to call the change_log_axis_base function after doing all the
# plotting. By default, it will try to infer the scaling used for the axis and only
# adjust accordingly.
cosmoplots.change_log_axis_base(ax1, base=base)
# Plotting
fig = plt.figure()
ax2 = plt.gca()
ax2.set_xlabel("X Axis")
ax2.set_ylabel("Y Axis")
base = 2  # Default is 10, but 2 works equally well
cosmoplots.change_log_axis_base(ax2, "x", base=base)
# Do plotting ...
# If you use "plot", the change_log_axis_base can be called at the top (along with add_axes
# etc.), but using loglog, semilogx, semilogy will re-set, and the change_log_axis_base
# function must be called again.
ax2.plot(a)
plt.show()

matplotlib vs. cosmoplots defaults

import matplotlib.pyplot as plt
import cosmoplots
import numpy as np

def plot() -> None:
    a = np.exp(np.linspace(-3, 5, 100))
    fig = plt.figure()
    ax = fig.add_subplot()
    ax.set_xlabel("X Axis")
    ax.set_ylabel("Y Axis")
    ax.semilogy(a)

# Matplotlib ------------------------------------------------------------------------- #
with plt.style.context("default"):
    plot()
    # plt.savefig("assets/matplotlib.png")
    plt.show()

# Cosmoplots ------------------------------------------------------------------------- #
with plt.style.context("cosmoplots.default"):
    plot()
    # plt.savefig("assets/cosmoplots.png")
    plt.show()
matplotlib cosmoplots
matplotlib cosmoplots

generate_hex_colors

This function generates the hex numbers for the colours extracted from a matplotlib colour map based on the number of points of interest. The colors change gradually from bright to dark or vice versa.

import matplotlib.pyplot as plt
import cosmoplots
plt.style.use(["cosmoplots.default"])


color_list = cosmoplots.generate_hex_colors(5, 'viridis', show_swatch=True, ascending=True)
plt.savefig("./assets/hex_colors.png")

# Print color_list to retrieve the hex numbers
print(color_list) #['#fde725', '#5ec962', '#21918c', '#3b528b', '#440154']

fig = plt.figure()
ax = plt.gca()
for i, color in enumerate(color_list):
    ax.plot([1,2],[i,i+1], c = color)

plt.savefig("./assets/hex_colors_example.png")
plt.show()
hex_colors.png hex_colors_example.png
colors colors

combine

Sometimes, plots might be related and better placed as subfigures in a larger figure. If combining the plots using the subfigure environment in latex or similar is not an option, this is easily done with imagemagick in a systematic way.

The Combine class within the concat module implements such procedures, and is also conveniently available from the combine function in cosmoplots.

An example is shown below. Also see the tests directory for more examples. A help method that prints the imagemagick commands that are used under the hood is also available.

import matplotlib.pyplot as plt
import cosmoplots
plt.style.use("cosmoplots.default")
import numpy as np


def plot(i) -> None:
    """Create a simple plot."""
    a = np.exp(np.linspace(-3, 5, 100))
    fig = plt.figure()
    ax = fig.add_subplot()
    ax.set_xlabel("X Axis")
    ax.set_ylabel("Y Axis")
    ax.semilogy(a)
    plt.savefig(f"./assets/{i}.png")
    plt.close(fig)

plot(1)
plot(2)
plot(3)
plot(4)
plot(5)
plot(6)
plot(7)
plot(8)
plot(9)
plot(10)
# See `convert -list font` for all available fonts.
figs = [f"./assets/{i}.png" for i in range(1, 11)]
cosmoplots.combine(*figs).using(
    font="JetBrainsMonoNL-NFM-Medium",
    fontsize=60,
    gravity="southeast",
    pos=(100, 200),
    color="green",
).in_grid(w=3, h=4).with_labels(  # Specifying labels is optional
    "one", "four", "three", "two", "eight", "six", "seven", "five", "nine", "ten"
).save("./assets/concat.png")

# Note that cosmoplots.combine() == cosmoplots.Combine().combine()
cosmoplots.combine().help()
# Or equivalently
cosmoplots.Combine().help()

concat

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

cosmoplots-0.4.3.tar.gz (13.8 kB view details)

Uploaded Source

Built Distribution

cosmoplots-0.4.3-py3-none-any.whl (14.5 kB view details)

Uploaded Python 3

File details

Details for the file cosmoplots-0.4.3.tar.gz.

File metadata

  • Download URL: cosmoplots-0.4.3.tar.gz
  • Upload date:
  • Size: 13.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.19

File hashes

Hashes for cosmoplots-0.4.3.tar.gz
Algorithm Hash digest
SHA256 4b52ac885a80d670b9baa816bbce26606f80319289c55d1de6830b007cfff328
MD5 c9c2ecd46472db7563ed8867f2ada472
BLAKE2b-256 ca0849fa13efe42bfaa6c363e7aa392053e20589577457385c445d3c12e87ac1

See more details on using hashes here.

File details

Details for the file cosmoplots-0.4.3-py3-none-any.whl.

File metadata

  • Download URL: cosmoplots-0.4.3-py3-none-any.whl
  • Upload date:
  • Size: 14.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.19

File hashes

Hashes for cosmoplots-0.4.3-py3-none-any.whl
Algorithm Hash digest
SHA256 3447386e13252fd4681de8b5f7823970439bdb4b19bafb91f15edaed13332cf4
MD5 745823b799188130ccc6d0c8cccb1579
BLAKE2b-256 5be49a3f1d6c88e6332f1d04c8c2941ba0f5dd1cfb58d6d95860598535507cc9

See more details on using hashes here.

Supported by

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