.. _units-evans_test:

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



.. plot:: /home/mandrake/rpm/BUILD/matplotlib-0.99.3/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
    """
    
    import matplotlib
    matplotlib.rcParams['units'] = True
    
    from matplotlib.cbook import iterable
    import matplotlib.units as units
    import matplotlib.ticker as ticker
    from pylab import figure, show
    
    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:
    
        @staticmethod
        def axisinfo(unit, axis):
            'return the Foo AxisInfo'
            if unit==1.0 or unit==2.0:
                return units.AxisInfo(
                    majloc = ticker.IndexLocator( 4, 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 = figure()
    fig.subplots_adjust(bottom=0.2)
    ax = fig.add_subplot(111)
    ax.plot( x, y, 'o', xunits=2.0 )
    for label in ax.get_xticklabels():
        label.set_rotation(30)
        label.set_ha('right')
    
    #fig.savefig('plot1.png')
    
    # plot without specifying units; will use the None branch for axisinfo
    fig2 = figure()
    ax = fig2.add_subplot(111)
    ax.plot( x, y ) # uses default units
    #p.savefig('plot2.png')
    
    fig3 = figure()
    ax = fig3.add_subplot(111)
    ax.plot( x, y, xunits=0.5)
    
    show()
    

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