
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "gallery/units/evans_test.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. meta::
        :keywords: codex

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download_gallery_units_evans_test.py>`
        to download the full example code.

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_gallery_units_evans_test.py:


==========
Evans test
==========

A mockup "Foo" units class which supports conversion and different tick
formatting depending on the "unit".  Here the "unit" is just a scalar
conversion factor, but this example shows that Matplotlib is entirely agnostic
to what kind of units client packages use.

.. GENERATED FROM PYTHON SOURCE LINES 11-88



.. image-sg:: /gallery/units/images/sphx_glr_evans_test_001.png
   :alt: Custom units, default units, xunits = 2.0
   :srcset: /gallery/units/images/sphx_glr_evans_test_001.png, /gallery/units/images/sphx_glr_evans_test_001_2_00x.png 2.00x
   :class: sphx-glr-single-img





.. code-block:: Python


    import matplotlib.pyplot as plt
    import numpy as np

    import matplotlib.ticker as ticker
    import matplotlib.units as units


    class Foo:
        def __init__(self, val, unit=1.0):
            self.unit = unit
            self._val = val * unit

        def value(self, unit):
            if unit is None:
                unit = self.unit
            return self._val / unit


    class FooConverter(units.ConversionInterface):
        @staticmethod
        def axisinfo(unit, axis):
            """Return the Foo AxisInfo."""
            if unit == 1.0 or unit == 2.0:
                return units.AxisInfo(
                    majloc=ticker.IndexLocator(8, 0),
                    majfmt=ticker.FormatStrFormatter("VAL: %s"),
                    label='foo',
                    )

            else:
                return None

        @staticmethod
        def convert(obj, unit, axis):
            """
            Convert *obj* using *unit*.

            If *obj* is a sequence, return the converted sequence.
            """
            if np.iterable(obj):
                return [o.value(unit) for o in obj]
            else:
                return obj.value(unit)

        @staticmethod
        def default_units(x, axis):
            """Return the default unit for *x* or None."""
            if np.iterable(x):
                for thisx in x:
                    return thisx.unit
            else:
                return x.unit


    units.registry[Foo] = FooConverter()

    # create some Foos
    x = [Foo(val, 1.0) for val in range(0, 50, 2)]
    # and some arbitrary y data
    y = [i for i in range(len(x))]

    fig, (ax1, ax2) = plt.subplots(1, 2)
    fig.suptitle("Custom units")
    fig.subplots_adjust(bottom=0.2)

    # plot specifying units
    ax2.plot(x, y, 'o', xunits=2.0)
    ax2.set_title("xunits = 2.0")
    plt.setp(ax2.get_xticklabels(), rotation=30, ha='right')

    # plot without specifying units; will use the None branch for axisinfo
    ax1.plot(x, y)  # uses default units
    ax1.set_title('default units')
    plt.setp(ax1.get_xticklabels(), rotation=30, ha='right')

    plt.show()


.. _sphx_glr_download_gallery_units_evans_test.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: evans_test.ipynb <evans_test.ipynb>`

    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: evans_test.py <evans_test.py>`

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: evans_test.zip <evans_test.zip>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
