Source code for pyrfu.plot

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Built-in imports
import os
import shutil
import warnings

# 3rd party imports
import cycler
import matplotlib as mpl
from matplotlib import style

# Local imports
from .add_position import add_position
from .annotate_heatmap import annotate_heatmap
from .colorbar import colorbar
from .make_labels import make_labels
from .mms_pl_config import mms_pl_config
from .pl_scatter_matrix import pl_scatter_matrix
from .pl_tx import pl_tx
from .plot_ang_ang import plot_ang_ang
from .plot_clines import plot_clines
from .plot_heatmap import plot_heatmap
from .plot_line import plot_line
from .plot_magnetosphere import plot_magnetosphere
from .plot_projection import plot_projection
from .plot_reduced_2d import plot_reduced_2d
from .plot_spectr import plot_spectr
from .plot_surf import plot_surf
from .span_tint import span_tint
from .zoom import zoom

__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"


__all__ = [
    "add_position",
    "annotate_heatmap",
    "colorbar",
    "make_labels",
    "mms_pl_config",
    "pl_scatter_matrix",
    "pl_tx",
    "plot_ang_ang",
    "plot_clines",
    "plot_heatmap",
    "plot_line",
    "plot_magnetosphere",
    "plot_projection",
    "plot_reduced_2d",
    "plot_spectr",
    "plot_surf",
    "set_color_cycle",
    "span_tint",
    "use_pyrfu_style",
    "zoom",
]

stylesheets = os.path.join(os.path.dirname(os.path.abspath(__file__)), "stylesheets")
style.core.USER_LIBRARY_PATHS.append(stylesheets)
style.core.reload_library()

EXTRA_COLORS = {
    "pyrfu:bg": "#eeeeee",
    "pyrfu:fg": "#444444",
    "pyrfu:bgAlt": "#e4e4e4",
    "pyrfu:red": "#af0000",
    "pyrfu:green": "#008700",
    "pyrfu:blue": "#005f87",
    "pyrfu:yellow": "#afaf00",
    "pyrfu:orange": "#d75f00",
    "pyrfu:pink": "#d70087",
    "pyrfu:purple": "#8700af",
    "pyrfu:lightblue": "#0087af",
    "pyrfu:olive": "#5f7800",
    "on:bg": "#1b2b34",
    "on:fg": "#cdd3de",
    "on:bgAlt": "#343d46",
    "on:fgAlt": "#d8dee9",
    "on:red": "#ec5f67",
    "on:orange": "#f99157",
    "on:yellow": "#fac863",
    "on:green": "#99c794",
    "on:cyan": "#5fb3b3",
    "on:blue": "#6699cc",
    "on:pink": "#c594c5",
    "on:brown": "#ab7967",
    "series:cyan": "#54c9d1",
    "series:orange": "#eca89a",
    "series:blue": "#95bced",
    "series:olive": "#ceb776",
    "series:purple": "#d3a9ea",
    "series:green": "#9bc57f",
    "series:pink": "#f0a1ca",
    "series:turquoise": "#5fcbaa",
    "transparent": "#ffffff00",
    "mms:mms1": "#000000",
    "mms:mms2": "#d55e00",
    "mms:mms3": "#009e73",
    "mms:mms4": "#56b4e9",
    "cluster:cluster1": "#ff0000",
    "cluster:cluster2": "#008000",
    "cluster:cluster3": "#0000ff",
    "cluster:cluster4": "#00ffff",
}

mpl.colors.EXTRA_COLORS = EXTRA_COLORS
mpl.colors.colorConverter.colors.update(EXTRA_COLORS)
mpl.colormaps.register(
    name="parula",
    cmap=mpl.colors.LinearSegmentedColormap.from_list(
        "parula",
        [
            (0.0592, 0.3599, 0.8684),
            (0.078, 0.5041, 0.8385),
            (0.0232, 0.6419, 0.7914),
            (0.1802, 0.7178, 0.6425),
            (0.5301, 0.7492, 0.4662),
            (0.8186, 0.7328, 0.3499),
            (0.9956, 0.7862, 0.1968),
            (0.9764, 0.9832, 0.0539),
        ],
        N=2560,
    ),
)
mpl.colormaps.register(
    name="hot_desaturated",
    cmap=mpl.colors.LinearSegmentedColormap.from_list(
        "hot_desaturated",
        [
            (0.2784, 0.2784, 0.8588),
            (0.0000, 0.0000, 0.3569),
            (0.0000, 1.0000, 1.0000),
            (0.0000, 0.5000, 0.0000),
            (1.0000, 1.0000, 0.0000),
            (1.0000, 0.3765, 0.0000),
            (0.4196, 0.0000, 0.0000),
            (0.8784, 0.2980, 0.2980),
        ],
        N=2560,
    ),
)

mpl.colormaps.register(
    name="hot_white_desaturated",
    cmap=mpl.colors.LinearSegmentedColormap.from_list(
        "hot_white_desaturated",
        [
            (1.0000, 1.0000, 1.0000),
            (0.2784, 0.2784, 0.8588),
            (0.0000, 0.0000, 0.3569),
            (0.0000, 1.0000, 1.0000),
            (0.0000, 0.5000, 0.0000),
            (1.0000, 1.0000, 0.0000),
            (1.0000, 0.3765, 0.0000),
            (0.4196, 0.0000, 0.0000),
            (0.8784, 0.2980, 0.2980),
        ],
        N=2560,
    ),
)


[docs]def set_color_cycle(pal: str = "") -> (list, str): r"""Sets color cycle. Parameters ---------- pal : {"Pyrfu", "Oceanic", "Tab", ""}. Optional The palette to use. "Tab" provides the default matplotlib palette. Default is "" (resets to default palette). """ if pal.lower() == "pyrfu": colors = [ "pyrfu:blue", "pyrfu:green", "pyrfu:red", "pyrfu:fg", "pyrfu:orange", "pyrfu:purple", "pyrfu:yellow", "pyrfu:lightblue", "pyrfu:olive", ] cmap = "hot_white_desaturated" elif pal.lower() == "oceanic": colors = [ "on:green", "on:red", "on:blue", "on:cyan", "on:orange", "on:pink", "on:yellow", ] cmap = "ocean" elif pal.lower() == "tab" or pal.lower() == "tableau" or pal.lower() == "mpl": colors = [ "tab:blue", "tab:orange", "tab:green", "tab:red", "tab:purple", "tab:brown", "tab:pink", "tab:gray", "tab:olive", "tab:cyan", ] cmap = "Spectral_r" else: colors = [ "series:cyan", "series:orange", "series:blue", "series:olive", "series:purple", "series:green", "series:pink", ] cmap = "jet" mpl.rcParams["axes.prop_cycle"] = cycler.cycler(color=colors) mpl.rcParams["image.cmap"] = cmap return colors, cmap
[docs]def use_pyrfu_style( name: str = "default", color_cycle: str = "pyrfu", fancy_legend: bool = False, usetex: bool = False, ): r"""Setup plot style. Parameters ---------- name : str, Optional Name of the style sheet. Default is "default" (see also https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html). color_cycle : str, Optional Name of the color cycle to use. Default is "pyrfu". fancy_legend : bool, Optional Use matplotlib's fancy legend frame. Default is False. usetex : bool, Optional Use LaTeX installation to set text. Default is False. If no LaTeX installation is found, this package will fallback to usetex=False. """ if usetex: if ( shutil.which("pdflatex") is None or shutil.which("dvipng") is None or shutil.which("gs") is None ): warnings.warn( "No LaTeX installation found pyrfu.plot is falling back to usetex=False" ) usetex = False style.use(name) set_color_cycle(color_cycle) mpl.rcParams["xtick.minor.visible"] = True mpl.rcParams["ytick.minor.visible"] = True if not usetex: mpl.rcParams["text.usetex"] = False mpl.rcParams["mathtext.sf"] = "sans" mpl.rcParams["mathtext.fontset"] = "dejavusans" else: mpl.rcParams["text.latex.preamble"] = "\n".join( [ r"\usepackage{amsmath}", r"\usepackage{physics}", r"\usepackage{siunitx}", r"\usepackage{bm}", ] ) if not fancy_legend: mpl.rcParams["legend.frameon"] = False mpl.rcParams["legend.fancybox"] = False mpl.rcParams["legend.framealpha"] = 0.75