
.. 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_zoom_effect.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_zoom_effect.py>`
        to download the full example code.

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

.. _sphx_glr_gallery_subplots_axes_and_figures_axes_zoom_effect.py:


================
Axes zoom effect
================

.. GENERATED FROM PYTHON SOURCE LINES 7-124

.. code-block:: Python


    import matplotlib.pyplot as plt

    from matplotlib.transforms import (Bbox, TransformedBbox,
                                       blended_transform_factory)
    from mpl_toolkits.axes_grid1.inset_locator import (BboxConnector,
                                                       BboxConnectorPatch,
                                                       BboxPatch)


    def connect_bbox(bbox1, bbox2,
                     loc1a, loc2a, loc1b, loc2b,
                     prop_lines, prop_patches=None):
        if prop_patches is None:
            prop_patches = {
                **prop_lines,
                "alpha": prop_lines.get("alpha", 1) * 0.2,
                "clip_on": False,
            }

        c1 = BboxConnector(
            bbox1, bbox2, loc1=loc1a, loc2=loc2a, clip_on=False, **prop_lines)
        c2 = BboxConnector(
            bbox1, bbox2, loc1=loc1b, loc2=loc2b, clip_on=False, **prop_lines)

        bbox_patch1 = BboxPatch(bbox1, **prop_patches)
        bbox_patch2 = BboxPatch(bbox2, **prop_patches)

        p = BboxConnectorPatch(bbox1, bbox2,
                               loc1a=loc1a, loc2a=loc2a, loc1b=loc1b, loc2b=loc2b,
                               clip_on=False,
                               **prop_patches)

        return c1, c2, bbox_patch1, bbox_patch2, p


    def zoom_effect01(ax1, ax2, xmin, xmax, **kwargs):
        """
        Connect *ax1* and *ax2*. The *xmin*-to-*xmax* range in both Axes will
        be marked.

        Parameters
        ----------
        ax1
            The main Axes.
        ax2
            The zoomed Axes.
        xmin, xmax
            The limits of the colored area in both plot Axes.
        **kwargs
            Arguments passed to the patch constructor.
        """

        bbox = Bbox.from_extents(xmin, 0, xmax, 1)

        mybbox1 = TransformedBbox(bbox, ax1.get_xaxis_transform())
        mybbox2 = TransformedBbox(bbox, ax2.get_xaxis_transform())

        prop_patches = {**kwargs, "ec": "none", "alpha": 0.2}

        c1, c2, bbox_patch1, bbox_patch2, p = connect_bbox(
            mybbox1, mybbox2,
            loc1a=3, loc2a=2, loc1b=4, loc2b=1,
            prop_lines=kwargs, prop_patches=prop_patches)

        ax1.add_patch(bbox_patch1)
        ax2.add_patch(bbox_patch2)
        ax2.add_patch(c1)
        ax2.add_patch(c2)
        ax2.add_patch(p)

        return c1, c2, bbox_patch1, bbox_patch2, p


    def zoom_effect02(ax1, ax2, **kwargs):
        """
        ax1 : the main Axes
        ax1 : the zoomed Axes

        Similar to zoom_effect01.  The xmin & xmax will be taken from the
        ax1.viewLim.
        """

        tt = ax1.transScale + (ax1.transLimits + ax2.transAxes)
        trans = blended_transform_factory(ax2.transData, tt)

        mybbox1 = ax1.bbox
        mybbox2 = TransformedBbox(ax1.viewLim, trans)

        prop_patches = {**kwargs, "ec": "none", "alpha": 0.2}

        c1, c2, bbox_patch1, bbox_patch2, p = connect_bbox(
            mybbox1, mybbox2,
            loc1a=3, loc2a=2, loc1b=4, loc2b=1,
            prop_lines=kwargs, prop_patches=prop_patches)

        ax1.add_patch(bbox_patch1)
        ax2.add_patch(bbox_patch2)
        ax2.add_patch(c1)
        ax2.add_patch(c2)
        ax2.add_patch(p)

        return c1, c2, bbox_patch1, bbox_patch2, p


    axs = plt.figure().subplot_mosaic([
        ["zoom1", "zoom2"],
        ["main", "main"],
    ])

    axs["main"].set(xlim=(0, 5))
    zoom_effect01(axs["zoom1"], axs["main"], 0.2, 0.8)
    axs["zoom2"].set(xlim=(2, 3))
    zoom_effect02(axs["zoom2"], axs["main"])

    plt.show()


.. GENERATED FROM PYTHON SOURCE LINES 125-130

.. tags::

   component: subplot
   component: transform
   level: advanced


.. _sphx_glr_download_gallery_subplots_axes_and_figures_axes_zoom_effect.py:

.. only:: html

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

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

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

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

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

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

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


.. only:: html

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

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