@@ -92,6 +92,7 @@ def __init__(
92
92
self .zz_viewLim = Bbox .unit ()
93
93
self .xy_dataLim = Bbox .unit ()
94
94
self .zz_dataLim = Bbox .unit ()
95
+ self ._stale_viewlim_z = False
95
96
96
97
# inhibit autoscale_view until the axes are defined
97
98
# they can't be defined until Axes.__init__ has been called
@@ -230,6 +231,24 @@ def w_zaxis(self):
230
231
def _get_axis_list (self ):
231
232
return super ()._get_axis_list () + (self .zaxis , )
232
233
234
+ def _unstale_viewLim (self ):
235
+ # We should arrange to store this information once per share-group
236
+ # instead of on every axis.
237
+ scalex = any (ax ._stale_viewlim_x
238
+ for ax in self ._shared_x_axes .get_siblings (self ))
239
+ scaley = any (ax ._stale_viewlim_y
240
+ for ax in self ._shared_y_axes .get_siblings (self ))
241
+ scalez = any (ax ._stale_viewlim_z
242
+ for ax in self ._shared_z_axes .get_siblings (self ))
243
+ if scalex or scaley or scalez :
244
+ for ax in self ._shared_x_axes .get_siblings (self ):
245
+ ax ._stale_viewlim_x = False
246
+ for ax in self ._shared_y_axes .get_siblings (self ):
247
+ ax ._stale_viewlim_y = False
248
+ for ax in self ._shared_z_axes .get_siblings (self ):
249
+ ax ._stale_viewlim_z = False
250
+ self .autoscale_view (scalex = scalex , scaley = scaley , scalez = scalez )
251
+
233
252
def unit_cube (self , vals = None ):
234
253
minx , maxx , miny , maxy , minz , maxz = vals or self .get_w_lims ()
235
254
return [(minx , miny , minz ),
@@ -414,6 +433,8 @@ def apply_aspect(self, position=None):
414
433
415
434
@artist .allow_rasterization
416
435
def draw (self , renderer ):
436
+ self ._unstale_viewLim ()
437
+
417
438
# draw the background patch
418
439
self .patch .draw (renderer )
419
440
self ._frameon = False
@@ -478,7 +499,8 @@ def _on_units_changed(self, scalex=False, scaley=False, scalez=False):
478
499
Currently forces updates of data limits and view limits.
479
500
"""
480
501
self .relim ()
481
- self .autoscale_view (scalex = scalex , scaley = scaley , scalez = scalez )
502
+ self ._request_autoscale_view (scalex = scalex , scaley = scaley ,
503
+ scalez = scalez )
482
504
483
505
def update_datalim (self , xys , ** kwargs ):
484
506
pass
@@ -527,6 +549,24 @@ def set_autoscalez_on(self, b):
527
549
"""
528
550
self ._autoscaleZon = b
529
551
552
+ def set_xmargin (self , m ):
553
+ # docstring inherited
554
+ scalez = self ._stale_viewlim_z
555
+ super ().set_xmargin (m )
556
+ # Superclass is 2D and will call _request_autoscale_view with defaults
557
+ # for unknown Axis, which would be scalez=True, but it shouldn't be for
558
+ # this call, so restore it.
559
+ self ._stale_viewlim_z = scalez
560
+
561
+ def set_ymargin (self , m ):
562
+ # docstring inherited
563
+ scalez = self ._stale_viewlim_z
564
+ super ().set_ymargin (m )
565
+ # Superclass is 2D and will call _request_autoscale_view with defaults
566
+ # for unknown Axis, which would be scalez=True, but it shouldn't be for
567
+ # this call, so restore it.
568
+ self ._stale_viewlim_z = scalez
569
+
530
570
def set_zmargin (self , m ):
531
571
"""
532
572
Set padding of Z data limits prior to autoscaling.
@@ -541,6 +581,7 @@ def set_zmargin(self, m):
541
581
if m < 0 or m > 1 :
542
582
raise ValueError ("margin must be in range 0 to 1" )
543
583
self ._zmargin = m
584
+ self ._request_autoscale_view (scalex = False , scaley = False , scalez = True )
544
585
self .stale = True
545
586
546
587
def margins (self , * margins , x = None , y = None , z = None , tight = True ):
@@ -638,8 +679,8 @@ def autoscale(self, enable=True, axis='both', tight=None):
638
679
self ._autoscaleZon = scalez = bool (enable )
639
680
else :
640
681
scalez = False
641
- self .autoscale_view (tight = tight , scalex = scalex , scaley = scaley ,
642
- scalez = scalez )
682
+ self ._request_autoscale_view (tight = tight , scalex = scalex , scaley = scaley ,
683
+ scalez = scalez )
643
684
644
685
def auto_scale_xyz (self , X , Y , Z = None , had_data = None ):
645
686
# This updates the bounding boxes as to keep a record as to what the
@@ -655,6 +696,19 @@ def auto_scale_xyz(self, X, Y, Z=None, had_data=None):
655
696
# Let autoscale_view figure out how to use this data.
656
697
self .autoscale_view ()
657
698
699
+ # API could be better, right now this is just to match the old calls to
700
+ # autoscale_view() after each plotting method.
701
+ def _request_autoscale_view (self , tight = None , scalex = True , scaley = True ,
702
+ scalez = True ):
703
+ if tight is not None :
704
+ self ._tight = tight
705
+ if scalex :
706
+ self ._stale_viewlim_x = True # Else keep old state.
707
+ if scaley :
708
+ self ._stale_viewlim_y = True
709
+ if scalez :
710
+ self ._stale_viewlim_z = True
711
+
658
712
def autoscale_view (self , tight = None , scalex = True , scaley = True ,
659
713
scalez = True ):
660
714
"""
@@ -765,6 +819,9 @@ def set_xlim3d(self, left=None, right=None, emit=True, auto=False,
765
819
left , right = sorted ([left , right ], reverse = bool (reverse ))
766
820
self .xy_viewLim .intervalx = (left , right )
767
821
822
+ # Mark viewlims as no longer stale without triggering an autoscale.
823
+ for ax in self ._shared_x_axes .get_siblings (self ):
824
+ ax ._stale_viewlim_x = False
768
825
if auto is not None :
769
826
self ._autoscaleXon = bool (auto )
770
827
@@ -820,6 +877,9 @@ def set_ylim3d(self, bottom=None, top=None, emit=True, auto=False,
820
877
bottom , top = top , bottom
821
878
self .xy_viewLim .intervaly = (bottom , top )
822
879
880
+ # Mark viewlims as no longer stale without triggering an autoscale.
881
+ for ax in self ._shared_y_axes .get_siblings (self ):
882
+ ax ._stale_viewlim_y = False
823
883
if auto is not None :
824
884
self ._autoscaleYon = bool (auto )
825
885
@@ -875,6 +935,9 @@ def set_zlim3d(self, bottom=None, top=None, emit=True, auto=False,
875
935
bottom , top = top , bottom
876
936
self .zz_viewLim .intervalx = (bottom , top )
877
937
938
+ # Mark viewlims as no longer stale without triggering an autoscale.
939
+ for ax in self ._shared_z_axes .get_siblings (self ):
940
+ ax ._stale_viewlim_z = False
878
941
if auto is not None :
879
942
self ._autoscaleZon = bool (auto )
880
943
@@ -1331,7 +1394,8 @@ def locator_params(self, axis='both', tight=None, **kwargs):
1331
1394
self .yaxis .get_major_locator ().set_params (** kwargs )
1332
1395
if _z :
1333
1396
self .zaxis .get_major_locator ().set_params (** kwargs )
1334
- self .autoscale_view (tight = tight , scalex = _x , scaley = _y , scalez = _z )
1397
+ self ._request_autoscale_view (tight = tight , scalex = _x , scaley = _y ,
1398
+ scalez = _z )
1335
1399
1336
1400
def tick_params (self , axis = 'both' , ** kwargs ):
1337
1401
"""
0 commit comments