.. _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.044 seconds) .. only :: html .. container:: sphx-glr-footer .. container:: sphx-glr-download :download:`Download Python source code: evans_test.py ` .. container:: sphx-glr-download :download:`Download Jupyter notebook: evans_test.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_