Source code for pyrfu.plot.zoom

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 3rd party imports
from matplotlib.axes import Axes
from matplotlib.transforms import TransformedBbox, blended_transform_factory
from mpl_toolkits.axes_grid1.inset_locator import (
    BboxConnector,
    BboxConnectorPatch,
    BboxPatch,
)

__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"


def _connect_bbox(
    bbox1,
    bbox2,
    loc1a,
    loc2a,
    loc1b,
    loc2b,
    prop_lines,
    prop_patches: dict = None,
):
    if prop_patches is None:
        prop_patches = {**prop_lines, "alpha": prop_lines.get("alpha", 1) * 0}

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

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

    connector_patch = BboxConnectorPatch(
        bbox1,
        bbox2,
        loc1a=loc1a,
        loc2a=loc2a,
        loc1b=loc1b,
        loc2b=loc2b,
        **prop_patches,
    )

    connector_patch.set_clip_on(False)

    return connector_a, connector_b, bbox_patch1, bbox_patch2, connector_patch


[docs]def zoom(ax1: Axes, ax2: Axes, **kwargs) -> (Axes, Axes): r"""Similar to zoom_effect01. The xmin & xmax will be taken from the ax1.viewLim. Parameters ---------- ax1 : matplotlib.axes._axes.Axes Reference axes. ax2 : matplotlib.axes._axes.Axes Connected axes. Other Parameters ---------------- **kwargs Keyword arguments control the BboxPatch. Returns ------- ax1 : matplotlib.axes._axes.Axes Reference axis. ax2 : matplotlib.axes._axes.Axes Connected axis. """ if not isinstance(ax1, Axes): raise TypeError("ax1 must be a matplotlib.axes._axes.Axes") if not isinstance(ax2, Axes): raise TypeError("ax2 must be a matplotlib.axes._axes.Axes") tt = ax1.transScale + (ax1.transLimits + ax2.transAxes) trans = blended_transform_factory(ax2.transData, tt) bbox_1 = ax1.bbox bbox_2 = TransformedBbox(ax1.viewLim, trans) c1, c2, p1, p2, p = _connect_bbox( bbox_1, bbox_2, loc1a=2, loc2a=3, loc1b=1, loc2b=4, prop_lines=kwargs, ) ax1.add_patch(p1) ax2.add_patch(p2) ax2.add_patch(c1) ax2.add_patch(c2) ax2.add_patch(p) return ax1, ax2