

.. _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 mpl
is entirely agnostic to what kind of units client packages use.





.. image:: /gallery/units/images/sphx_glr_evans_test_001.png
    :align: center





.. code-block:: python

    from matplotlib.cbook import iterable
    import matplotlib.units as units
    import matplotlib.ticker as ticker
    import matplotlib.pyplot as plt


    class Foo(object):
        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(object):
        @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 units.ConversionInterface.is_numlike(obj):
                return obj

            if 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 iterable(x):
                for thisx in x:
                    return thisx.unit
            else:
                return x.unit


    units.registry[Foo] = FooConverter()

    # create some Foos
    x = []
    for val in range(0, 50, 2):
        x.append(Foo(val, 1.0))

    # and some arbitrary y data
    y = [i for i in range(len(x))]


    # plot specifying units
    fig = plt.figure()
    fig.suptitle("Custom units")
    fig.subplots_adjust(bottom=0.2)
    ax = fig.add_subplot(1, 2, 2)
    ax.plot(x, y, 'o', xunits=2.0)
    for label in ax.get_xticklabels():
        label.set_rotation(30)
        label.set_ha('right')
    ax.set_title("xunits = 2.0")


    # plot without specifying units; will use the None branch for axisinfo
    ax = fig.add_subplot(1, 2, 1)
    ax.plot(x, y)  # uses default units
    ax.set_title('default units')
    for label in ax.get_xticklabels():
        label.set_rotation(30)
        label.set_ha('right')

    plt.show()

**Total running time of the script:** ( 0 minutes  0.136 seconds)



.. only :: html

 .. container:: sphx-glr-footer


  .. container:: sphx-glr-download

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



  .. container:: sphx-glr-download

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


.. only:: html

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

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