@@ -888,7 +888,7 @@ def iter_ticks(self):
888888 for tick in zip (* group ):
889889 yield tick
890890
891- def get_ticklabel_extents (self , renderer ):
891+ def get_ticklabel_extents_old (self , renderer ):
892892 """
893893 Get the extents of the tick labels on either side
894894 of the axes.
@@ -920,6 +920,26 @@ def get_ticklabel_extents(self, renderer):
920920 bbox2 = mtransforms .Bbox .from_extents (0 , 0 , 0 , 0 )
921921 return bbox , bbox2
922922
923+
924+ def get_ticklabel_extents (self , renderer ):
925+ """
926+ Get the extents of the tick labels on either side
927+ of the axes.
928+ """
929+
930+ ticks_to_draw = self ._update_ticks (renderer )
931+ ticklabelBoxes , ticklabelBoxes2 = self ._get_tick_bboxes (ticks_to_draw , renderer )
932+
933+ if len (ticklabelBoxes ):
934+ bbox = mtransforms .Bbox .union (ticklabelBoxes )
935+ else :
936+ bbox = mtransforms .Bbox .from_extents (0 , 0 , 0 , 0 )
937+ if len (ticklabelBoxes2 ):
938+ bbox2 = mtransforms .Bbox .union (ticklabelBoxes2 )
939+ else :
940+ bbox2 = mtransforms .Bbox .from_extents (0 , 0 , 0 , 0 )
941+ return bbox , bbox2
942+
923943 def set_smart_bounds (self ,value ):
924944 """set the axis to have smart bounds"""
925945 self ._smart_bounds = value
@@ -928,14 +948,13 @@ def get_smart_bounds(self):
928948 """get whether the axis has smart bounds"""
929949 return self ._smart_bounds
930950
931- @allow_rasterization
932- def draw (self , renderer , * args , ** kwargs ):
933- 'Draw the axis lines, grid lines, tick lines and labels'
934- ticklabelBoxes = []
935- ticklabelBoxes2 = []
951+ def _update_ticks (self , renderer ):
952+ """
953+ Update ticks (position and labels) using the current data
954+ interval of the axes. Returns a list of ticks that will be
955+ drawn.
956+ """
936957
937- if not self .get_visible (): return
938- renderer .open_group (__name__ )
939958 interval = self .get_view_interval ()
940959 tick_tups = [ t for t in self .iter_ticks ()]
941960 if self ._smart_bounds :
@@ -977,19 +996,81 @@ def draw(self, renderer, *args, **kwargs):
977996 tick_tups = [ ti for ti in tick_tups
978997 if (ti [1 ] >= ilow ) and (ti [1 ] <= ihigh )]
979998
999+ ticks_to_draw = []
9801000 for tick , loc , label in tick_tups :
9811001 if tick is None : continue
9821002 if not mtransforms .interval_contains (interval , loc ): continue
9831003 tick .update_position (loc )
9841004 tick .set_label1 (label )
9851005 tick .set_label2 (label )
986- tick .draw (renderer )
1006+ ticks_to_draw .append (tick )
1007+
1008+ return ticks_to_draw
1009+
1010+ def _get_tick_bboxes (self , ticks , renderer ):
1011+ """
1012+ Given the list of ticks, return two lists of bboxes. One for
1013+ tick lable1's and another for tick label2's.
1014+ """
1015+
1016+ ticklabelBoxes = []
1017+ ticklabelBoxes2 = []
1018+
1019+ for tick in ticks :
9871020 if tick .label1On and tick .label1 .get_visible ():
9881021 extent = tick .label1 .get_window_extent (renderer )
9891022 ticklabelBoxes .append (extent )
9901023 if tick .label2On and tick .label2 .get_visible ():
9911024 extent = tick .label2 .get_window_extent (renderer )
9921025 ticklabelBoxes2 .append (extent )
1026+ return ticklabelBoxes , ticklabelBoxes2
1027+
1028+ def get_tightbbox (self , renderer ):
1029+ """
1030+ Return a bounding box that encloses the axis. It only accounts
1031+ tick labels, axis label, and offsetText.
1032+ """
1033+ if not self .get_visible (): return
1034+
1035+ ticks_to_draw = self ._update_ticks (renderer )
1036+ ticklabelBoxes , ticklabelBoxes2 = self ._get_tick_bboxes (ticks_to_draw , renderer )
1037+
1038+ self ._update_label_position (ticklabelBoxes , ticklabelBoxes2 )
1039+
1040+ self ._update_offset_text_position (ticklabelBoxes , ticklabelBoxes2 )
1041+ self .offsetText .set_text ( self .major .formatter .get_offset () )
1042+
1043+
1044+ bb = []
1045+
1046+ for a in [self .label , self .offsetText ]:
1047+ if a .get_visible ():
1048+ bb .append (a .get_window_extent (renderer ))
1049+
1050+ bb .extend (ticklabelBoxes )
1051+ bb .extend (ticklabelBoxes2 )
1052+
1053+ #self.offsetText
1054+ bb = [b for b in bb if b .width != 0 or b .height != 0 ]
1055+ if bb :
1056+ _bbox = mtransforms .Bbox .union (bb )
1057+ return _bbox
1058+ else :
1059+ return None
1060+
1061+
1062+ @allow_rasterization
1063+ def draw (self , renderer , * args , ** kwargs ):
1064+ 'Draw the axis lines, grid lines, tick lines and labels'
1065+
1066+ if not self .get_visible (): return
1067+ renderer .open_group (__name__ )
1068+
1069+ ticks_to_draw = self ._update_ticks (renderer )
1070+ ticklabelBoxes , ticklabelBoxes2 = self ._get_tick_bboxes (ticks_to_draw , renderer )
1071+
1072+ for tick in ticks_to_draw :
1073+ tick .draw (renderer )
9931074
9941075 # scale up the axis label box to also find the neighbors, not
9951076 # just the tick labels that actually overlap note we need a
0 commit comments