
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "gallery/subplots_axes_and_figures/axes_box_aspect.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. meta::
        :keywords: codex

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

        :ref:`Go to the end <sphx_glr_download_gallery_subplots_axes_and_figures_axes_box_aspect.py>`
        to download the full example code.

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_gallery_subplots_axes_and_figures_axes_box_aspect.py:


===============
Axes box aspect
===============

This demo shows how to set the aspect of an Axes box directly via
`~.Axes.set_box_aspect`. The box aspect is the ratio between Axes height
and Axes width in physical units, independent of the data limits.
This is useful to e.g. produce a square plot, independent of the data it
contains, or to have a usual plot with the same axes dimensions next to
an image plot with fixed (data-)aspect.

The following lists a few use cases for `~.Axes.set_box_aspect`.

.. GENERATED FROM PYTHON SOURCE LINES 17-21

A square Axes, independent of data
----------------------------------

Produce a square Axes, no matter what the data limits are.

.. GENERATED FROM PYTHON SOURCE LINES 21-32

.. code-block:: Python


    import matplotlib.pyplot as plt
    import numpy as np

    fig1, ax = plt.subplots()

    ax.set_xlim(300, 400)
    ax.set_box_aspect(1)

    plt.show()


.. GENERATED FROM PYTHON SOURCE LINES 33-38

Shared square Axes
------------------

Produce shared subplots that are squared in size.


.. GENERATED FROM PYTHON SOURCE LINES 38-48

.. code-block:: Python

    fig2, (ax, ax2) = plt.subplots(ncols=2, sharey=True)

    ax.plot([1, 5], [0, 10])
    ax2.plot([100, 500], [10, 15])

    ax.set_box_aspect(1)
    ax2.set_box_aspect(1)

    plt.show()


.. GENERATED FROM PYTHON SOURCE LINES 49-55

Square twin Axes
----------------

Produce a square Axes, with a twin Axes. The twinned Axes takes over the
box aspect of the parent.


.. GENERATED FROM PYTHON SOURCE LINES 55-68

.. code-block:: Python


    fig3, ax = plt.subplots()

    ax2 = ax.twinx()

    ax.plot([0, 10])
    ax2.plot([12, 10])

    ax.set_box_aspect(1)

    plt.show()



.. GENERATED FROM PYTHON SOURCE LINES 69-79

Normal plot next to image
-------------------------

When creating an image plot with fixed data aspect and the default
``adjustable="box"`` next to a normal plot, the Axes would be unequal in
height. `~.Axes.set_box_aspect` provides an easy solution to that by allowing
to have the normal plot's Axes use the images dimensions as box aspect.

This example also shows that *constrained layout* interplays nicely with
a fixed box aspect.

.. GENERATED FROM PYTHON SOURCE LINES 79-91

.. code-block:: Python


    fig4, (ax, ax2) = plt.subplots(ncols=2, layout="constrained")

    np.random.seed(19680801)  # Fixing random state for reproducibility
    im = np.random.rand(16, 27)
    ax.imshow(im)

    ax2.plot([23, 45])
    ax2.set_box_aspect(im.shape[0]/im.shape[1])

    plt.show()


.. GENERATED FROM PYTHON SOURCE LINES 92-100

Square joint/marginal plot
--------------------------

It may be desirable to show marginal distributions next to a plot of joint
data. The following creates a square plot with the box aspect of the
marginal Axes being equal to the width- and height-ratios of the gridspec.
This ensures that all Axes align perfectly, independent on the size of the
figure.

.. GENERATED FROM PYTHON SOURCE LINES 100-117

.. code-block:: Python


    fig5, axs = plt.subplots(2, 2, sharex="col", sharey="row",
                             gridspec_kw=dict(height_ratios=[1, 3],
                                              width_ratios=[3, 1]))
    axs[0, 1].set_visible(False)
    axs[0, 0].set_box_aspect(1/3)
    axs[1, 0].set_box_aspect(1)
    axs[1, 1].set_box_aspect(3/1)

    np.random.seed(19680801)  # Fixing random state for reproducibility
    x, y = np.random.randn(2, 400) * [[.5], [180]]
    axs[1, 0].scatter(x, y)
    axs[0, 0].hist(x)
    axs[1, 1].hist(y, orientation="horizontal")

    plt.show()


.. GENERATED FROM PYTHON SOURCE LINES 118-125

Set data aspect with box aspect
-------------------------------

When setting the box aspect, one may still set the data aspect as well.
Here we create an Axes with a box twice as long as it is tall and use
an "equal" data aspect for its contents, i.e. the circle actually
stays circular.

.. GENERATED FROM PYTHON SOURCE LINES 125-135

.. code-block:: Python


    fig6, ax = plt.subplots()

    ax.add_patch(plt.Circle((5, 3), 1))
    ax.set_aspect("equal", adjustable="datalim")
    ax.set_box_aspect(0.5)
    ax.autoscale()

    plt.show()


.. GENERATED FROM PYTHON SOURCE LINES 136-141

Box aspect for many subplots
----------------------------

It is possible to pass the box aspect to an Axes at initialization. The
following creates a 2 by 3 subplot grid with all square Axes.

.. GENERATED FROM PYTHON SOURCE LINES 141-149

.. code-block:: Python


    fig7, axs = plt.subplots(2, 3, subplot_kw=dict(box_aspect=1),
                             sharex=True, sharey=True, layout="constrained")

    for i, ax in enumerate(axs.flat):
        ax.scatter(i % 3, -((i // 3) - 0.5)*200, c=[plt.cm.hsv(i / 6)], s=300)
    plt.show()


.. GENERATED FROM PYTHON SOURCE LINES 150-162

.. admonition:: References

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

   - `matplotlib.axes.Axes.set_box_aspect`

.. tags::

   component: axes
   styling: size
   level: beginner


.. _sphx_glr_download_gallery_subplots_axes_and_figures_axes_box_aspect.py:

.. only:: html

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

    .. container:: sphx-glr-download sphx-glr-download-jupyter

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

    .. container:: sphx-glr-download sphx-glr-download-python

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

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: axes_box_aspect.zip <axes_box_aspect.zip>`


.. only:: html

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

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