

.. _sphx_glr_gallery_pylab_examples_axes_zoom_effect.py:


================
Axes Zoom Effect
================





.. image:: /gallery/pylab_examples/images/sphx_glr_axes_zoom_effect_001.png
    :align: center





.. code-block:: python

    from matplotlib.transforms import Bbox, TransformedBbox, \
        blended_transform_factory

    from mpl_toolkits.axes_grid1.inset_locator import BboxPatch, BboxConnector,\
        BboxConnectorPatch


    def connect_bbox(bbox1, bbox2,
                     loc1a, loc2a, loc1b, loc2b,
                     prop_lines, prop_patches=None):
        if prop_patches is None:
            prop_patches = prop_lines.copy()
            prop_patches["alpha"] = prop_patches.get("alpha", 1)*0.2

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

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

        p = BboxConnectorPatch(bbox1, bbox2,
                               # loc1a=3, loc2a=2, loc1b=4, loc2b=1,
                               loc1a=loc1a, loc2a=loc2a, loc1b=loc1b, loc2b=loc2b,
                               **prop_patches)
        p.set_clip_on(False)

        return c1, c2, bbox_patch1, bbox_patch2, p


    def zoom_effect01(ax1, ax2, xmin, xmax, **kwargs):
        """
        ax1 : the main axes
        ax1 : the zoomed axes
        (xmin,xmax) : the limits of the colored area in both plot axes.

        connect ax1 & ax2. The x-range of (xmin, xmax) in both axes will
        be marked.  The keywords parameters will be used ti create
        patches.

        """

        trans1 = blended_transform_factory(ax1.transData, ax1.transAxes)
        trans2 = blended_transform_factory(ax2.transData, ax2.transAxes)

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

        mybbox1 = TransformedBbox(bbox, trans1)
        mybbox2 = TransformedBbox(bbox, trans2)

        prop_patches = kwargs.copy()
        prop_patches["ec"] = "none"
        prop_patches["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.copy()
        prop_patches["ec"] = "none"
        prop_patches["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


    import matplotlib.pyplot as plt

    plt.figure(1, figsize=(5, 5))
    ax1 = plt.subplot(221)
    ax2 = plt.subplot(212)
    ax2.set_xlim(0, 1)
    ax2.set_xlim(0, 5)
    zoom_effect01(ax1, ax2, 0.2, 0.8)


    ax1 = plt.subplot(222)
    ax1.set_xlim(2, 3)
    ax2.set_xlim(0, 5)
    zoom_effect02(ax1, ax2)

    plt.show()

**Total running time of the script:** ( 0 minutes  0.069 seconds)



.. container:: sphx-glr-footer


  .. container:: sphx-glr-download

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



  .. container:: sphx-glr-download

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

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

    `Generated by Sphinx-Gallery <https://sphinx-gallery.readthedocs.io>`_
