16
16
import matplotlib .contour as mcontour
17
17
import matplotlib .dates # noqa: F401, Register date unit converter as side effect.
18
18
import matplotlib .image as mimage
19
+ import matplotlib .inset as minset
19
20
import matplotlib .legend as mlegend
20
21
import matplotlib .lines as mlines
21
22
import matplotlib .markers as mmarkers
@@ -418,7 +419,7 @@ def inset_axes(self, bounds, *, transform=None, zorder=5, **kwargs):
418
419
return inset_ax
419
420
420
421
@_docstring .dedent_interpd
421
- def indicate_inset (self , bounds , inset_ax = None , * , transform = None ,
422
+ def indicate_inset (self , bounds = None , inset_ax = None , * , transform = None ,
422
423
facecolor = 'none' , edgecolor = '0.5' , alpha = 0.5 ,
423
424
zorder = 4.99 , ** kwargs ):
424
425
"""
@@ -432,11 +433,12 @@ def indicate_inset(self, bounds, inset_ax=None, *, transform=None,
432
433
433
434
Parameters
434
435
----------
435
- bounds : [x0, y0, width, height]
436
+ bounds : [x0, y0, width, height], optional
436
437
Lower-left corner of rectangle to be marked, and its width
437
- and height.
438
+ and height. If not set, the bounds will be calculated from the
439
+ data limits of inset_ax, which must be supplied.
438
440
439
- inset_ax : `.Axes`
441
+ inset_ax : `.Axes`, optional
440
442
An optional inset Axes to draw connecting lines to. Two lines are
441
443
drawn connecting the indicator box to the inset Axes on corners
442
444
chosen so as to not overlap with the indicator box.
@@ -466,15 +468,19 @@ def indicate_inset(self, bounds, inset_ax=None, *, transform=None,
466
468
467
469
Returns
468
470
-------
469
- rectangle_patch : `.patches.Rectangle`
470
- The indicator frame.
471
+ inset_indicator : `.inset.InsetIndicator` artist containing
471
472
472
- connector_lines : 4-tuple of `.patches.ConnectionPatch`
473
- The four connector lines connecting to (lower_left, upper_left,
474
- lower_right upper_right) corners of *inset_ax*. Two lines are
475
- set with visibility to *False*, but the user can set the
476
- visibility to True if the automatic choice is not deemed correct.
473
+ inset_indicator.rectangle : `.Rectangle`
474
+ The indicator frame.
477
475
476
+ inset_indicator.connectors : 4-tuple of `.patches.ConnectionPatch`
477
+ The four connector lines connecting to (lower_left, upper_left,
478
+ lower_right upper_right) corners of *inset_ax*. Two lines are
479
+ set with visibility to *False*, but the user can set the
480
+ visibility to True if the automatic choice is not deemed correct.
481
+
482
+ .. versionchanged:: 3.10
483
+ Previously the rectangle and connectors tuple were returned.
478
484
"""
479
485
# to make the Axes connectors work, we need to apply the aspect to
480
486
# the parent Axes.
@@ -484,51 +490,13 @@ def indicate_inset(self, bounds, inset_ax=None, *, transform=None,
484
490
transform = self .transData
485
491
kwargs .setdefault ('label' , '_indicate_inset' )
486
492
487
- x , y , width , height = bounds
488
- rectangle_patch = mpatches .Rectangle (
489
- (x , y ), width , height ,
493
+ indicator_patch = minset .InsetIndicator (
494
+ bounds , inset_ax = inset_ax ,
490
495
facecolor = facecolor , edgecolor = edgecolor , alpha = alpha ,
491
496
zorder = zorder , transform = transform , ** kwargs )
492
- self .add_patch (rectangle_patch )
493
-
494
- connects = []
495
-
496
- if inset_ax is not None :
497
- # connect the inset_axes to the rectangle
498
- for xy_inset_ax in [(0 , 0 ), (0 , 1 ), (1 , 0 ), (1 , 1 )]:
499
- # inset_ax positions are in axes coordinates
500
- # The 0, 1 values define the four edges if the inset_ax
501
- # lower_left, upper_left, lower_right upper_right.
502
- ex , ey = xy_inset_ax
503
- if self .xaxis .get_inverted ():
504
- ex = 1 - ex
505
- if self .yaxis .get_inverted ():
506
- ey = 1 - ey
507
- xy_data = x + ex * width , y + ey * height
508
- p = mpatches .ConnectionPatch (
509
- xyA = xy_inset_ax , coordsA = inset_ax .transAxes ,
510
- xyB = xy_data , coordsB = self .transData ,
511
- arrowstyle = "-" , zorder = zorder ,
512
- edgecolor = edgecolor , alpha = alpha )
513
- connects .append (p )
514
- self .add_patch (p )
515
-
516
- # decide which two of the lines to keep visible....
517
- pos = inset_ax .get_position ()
518
- bboxins = pos .transformed (self .figure .transSubfigure )
519
- rectbbox = mtransforms .Bbox .from_bounds (
520
- * bounds
521
- ).transformed (transform )
522
- x0 = rectbbox .x0 < bboxins .x0
523
- x1 = rectbbox .x1 < bboxins .x1
524
- y0 = rectbbox .y0 < bboxins .y0
525
- y1 = rectbbox .y1 < bboxins .y1
526
- connects [0 ].set_visible (x0 ^ y0 )
527
- connects [1 ].set_visible (x0 == y1 )
528
- connects [2 ].set_visible (x1 == y0 )
529
- connects [3 ].set_visible (x1 ^ y1 )
530
-
531
- return rectangle_patch , tuple (connects ) if connects else None
497
+ self .add_artist (indicator_patch )
498
+
499
+ return indicator_patch
532
500
533
501
def indicate_inset_zoom (self , inset_ax , ** kwargs ):
534
502
"""
@@ -552,22 +520,22 @@ def indicate_inset_zoom(self, inset_ax, **kwargs):
552
520
553
521
Returns
554
522
-------
555
- rectangle_patch : `.patches.Rectangle`
556
- Rectangle artist.
557
-
558
- connector_lines : 4-tuple of `.patches.ConnectionPatch`
559
- Each of four connector lines coming from the rectangle drawn on
560
- this axis, in the order lower left, upper left, lower right,
561
- upper right.
562
- Two are set with visibility to *False*, but the user can
563
- set the visibility to *True* if the automatic choice is not deemed
564
- correct.
523
+ inset_indicator : `.inset.InsetIndicator` artist containing
524
+
525
+ inset_indicator.rectangle : `.Rectangle`
526
+ The indicator frame.
527
+
528
+ inset_indicator.connectors : 4-tuple of `.patches.ConnectionPatch`
529
+ The four connector lines connecting to (lower_left, upper_left,
530
+ lower_right upper_right) corners of *inset_ax*. Two lines are
531
+ set with visibility to *False*, but the user can set the
532
+ visibility to True if the automatic choice is not deemed correct.
533
+
534
+ .. versionchanged:: 3.10
535
+ Previously the rectangle and connectors tuple were returned.
565
536
"""
566
537
567
- xlim = inset_ax .get_xlim ()
568
- ylim = inset_ax .get_ylim ()
569
- rect = (xlim [0 ], ylim [0 ], xlim [1 ] - xlim [0 ], ylim [1 ] - ylim [0 ])
570
- return self .indicate_inset (rect , inset_ax , ** kwargs )
538
+ return self .indicate_inset (None , inset_ax , ** kwargs )
571
539
572
540
@_docstring .dedent_interpd
573
541
def secondary_xaxis (self , location , functions = None , * , transform = None , ** kwargs ):
0 commit comments