.. _units-evans_test:

units example code: evans_test.py
=================================



.. plot:: /home/tcaswell/source/p/matplotlib/doc/mpl_examples/units/evans_test.py

::

    """
    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
    """
    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()
    

Keywords: python, matplotlib, pylab, example, codex (see :ref:`how-to-search-examples`)