Source code for typhon.plots.formatter

# -*- coding: utf-8 -*-
"""Custom tick formatter. """
import matplotlib.pyplot as plt
from matplotlib.ticker import LogFormatter, FuncFormatter

from typhon import constants


__all__ = [
    'set_xaxis_formatter',
    'set_yaxis_formatter',
    'HectoPascalFormatter',
    'HectoPascalLogFormatter',
    'ScalingFormatter',
]


[docs]def set_xaxis_formatter(formatter, ax=None): """Set given formatter for major and minor xticks.""" if ax is None: ax = plt.gca() ax.xaxis.set_major_formatter(formatter) ax.xaxis.set_minor_formatter(formatter)
[docs]def set_yaxis_formatter(formatter, ax=None): """Set given formatter for major and minor yticks.""" if ax is None: ax = plt.gca() ax.yaxis.set_major_formatter(formatter) ax.yaxis.set_minor_formatter(formatter)
[docs]def ScalingFormatter(scaling=1, fmtstr='{x:g}'): """Provide a ticklabel formatter that applies scaling. Parameters: scaling (float or string): Scaling that is applied to all labels. If `str`, try to find corresponding scale in `typhon.constants`. fmtstr (str): Format string used to create label text. The field `x` is replaced with the scaled label value. Returns: matplotlib.ticker.FuncFormatter: Formatter. Examples: .. plot:: :include-source: import numpy as np import matplotlib.pyplot as plt from typhon.plots import (set_yaxis_formatter, ScalingFormatter) y = 1e6 * np.random.randn(100) fig, ax = plt.subplots() ax.plot(y) ax.set_ylabel('y') ax.set_title('default') fig, ax = plt.subplots() ax.plot(y) set_yaxis_formatter(ScalingFormatter(scaling=1e6)) ax.set_ylabel('y in millions') ax.set_title('float scaling') fig, ax = plt.subplots() ax.plot(y) set_yaxis_formatter(ScalingFormatter(scaling=1e6, fmtstr='{x:g}M')) ax.set_ylabel('y') ax.set_title('float scaling and custom label') fig, ax = plt.subplots() ax.plot(y) set_yaxis_formatter(ScalingFormatter(scaling='kilo', fmtstr='{x:g}k')) ax.set_ylabel('y') ax.set_title('string scaling and custom label') plt.show() """ # Try to find string scaling as attributes in `typhon.constants`. if isinstance(scaling, str): scaling = getattr(constants, scaling) @FuncFormatter def formatter(x, pos): return fmtstr.format(x=x / scaling) return formatter
[docs]def HectoPascalFormatter(): """Creates hectopascal labels for pascal input. Note: Simple wrapper for :func:`~typhon.plots.ScalingFormatter`. Examples: .. plot:: :include-source: import numpy as np import matplotlib.pyplot as plt import typhon from typhon.plots import (set_yaxis_formatter, HectoPascalFormatter) p = typhon.math.nlogspace(1000e2, 0.1e2, 50) fig, ax = plt.subplots() ax.plot(np.exp(p / p[0]), p) ax.invert_yaxis() set_yaxis_formatter(HectoPascalFormatter()) plt.show() See also: :func:`~typhon.plots.HectoPascalLogFormatter` Creates logarithmic hectopascal labels for pascal input. """ return ScalingFormatter('hecto')
[docs]class HectoPascalLogFormatter(LogFormatter): """Creates logarithmic hectopascal labels for pascal input. This class can be used to create axis labels on the hectopascal scale for values plotted in pascals. It is handy in combination with plotting in logscale. Examples: .. plot:: :include-source: import numpy as np import matplotlib.pyplot as plt import typhon from typhon.plots import (set_yaxis_formatter, HectoPascalLogFormatter) p = typhon.math.nlogspace(1000e2, 0.1e2, 50) # pressue in Pa fig, ax = plt.subplots() ax.semilogy(np.exp(p / p[0]), p) ax.invert_yaxis() set_yaxis_formatter(typhon.plots.HectoPascalLogFormatter()) plt.show() See also: :func:`~typhon.plots.HectoPascalFormatter` Creates hectopascal labels for pascal input. """ # TODO (lkluft): Hack to preserve automatic toggling to minor ticks for # log-scales introduced in matplotlib 2.0. # Could be replaced with a decent Formatter subclass in the future. def _num_to_string(self, x, vmin, vmax): return '{:g}'.format(x / 100)