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

    Click :ref:`here <sphx_glr_download_gallery_images_contours_and_fields_affine_image.py>` to download the full example code
.. rst-class:: sphx-glr-example-title

.. _sphx_glr_gallery_images_contours_and_fields_affine_image.py:


============================
Affine transform of an image
============================


Prepending an affine transformation (:class:`~.transforms.Affine2D`)
to the :ref:`data transform <data-coords>`
of an image allows to manipulate the image's shape and orientation.
This is an example of the concept of
:ref:`transform chaining <transformation-pipeline>`.

For the backends that support draw_image with optional affine
transform (e.g., agg, ps backend), the image of the output should
have its boundary match the dashed yellow rectangle.



.. code-block:: python


    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.transforms as mtransforms


    def get_image():
        delta = 0.25
        x = y = np.arange(-3.0, 3.0, delta)
        X, Y = np.meshgrid(x, y)
        Z1 = np.exp(-X**2 - Y**2)
        Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
        Z = (Z1 - Z2)
        return Z


    def do_plot(ax, Z, transform):
        im = ax.imshow(Z, interpolation='none',
                       origin='lower',
                       extent=[-2, 4, -3, 2], clip_on=True)

        trans_data = transform + ax.transData
        im.set_transform(trans_data)

        # display intended extent of the image
        x1, x2, y1, y2 = im.get_extent()
        ax.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "y--",
                transform=trans_data)
        ax.set_xlim(-5, 5)
        ax.set_ylim(-4, 4)


    # prepare image and figure
    fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
    Z = get_image()

    # image rotation
    do_plot(ax1, Z, mtransforms.Affine2D().rotate_deg(30))

    # image skew
    do_plot(ax2, Z, mtransforms.Affine2D().skew_deg(30, 15))

    # scale and reflection
    do_plot(ax3, Z, mtransforms.Affine2D().scale(-1, .5))

    # everything and a translation
    do_plot(ax4, Z, mtransforms.Affine2D().
            rotate_deg(30).skew_deg(30, 15).scale(-1, .5).translate(.5, -1))

    plt.show()





.. image:: /gallery/images_contours_and_fields/images/sphx_glr_affine_image_001.png
    :class: sphx-glr-single-img




------------

References
""""""""""

The use of the following functions, methods and classes is shown
in this example:



.. code-block:: python


    import matplotlib
    matplotlib.axes.Axes.imshow
    matplotlib.pyplot.imshow
    matplotlib.transforms.Affine2D







.. _sphx_glr_download_gallery_images_contours_and_fields_affine_image.py:


.. only :: html

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



  .. container:: sphx-glr-download

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



  .. container:: sphx-glr-download

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


.. only:: html

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

    Keywords: matplotlib code example, codex, python plot, pyplot
    `Gallery generated by Sphinx-Gallery
    <https://sphinx-gallery.readthedocs.io>`_
