Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 635cf1f

Browse files
committed
implement Axis.get_tightbbox and account offsetText in calculating
1 parent 8c6e42a commit 635cf1f

2 files changed

Lines changed: 99 additions & 23 deletions

File tree

lib/matplotlib/axes.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8343,24 +8343,19 @@ def get_tightbbox(self, renderer):
83438343
artists = []
83448344
bb = []
83458345

8346-
artists.append(self)
8346+
if not self.get_visible():
8347+
return None
83478348

8348-
if self.title.get_visible():
8349-
artists.append(self.title)
8349+
bb.append(self.get_window_extent(renderer))
83508350

8351-
if self.xaxis.get_visible():
8352-
artists.append(self.xaxis.label)
8353-
bbx1, bbx2 = self.xaxis.get_ticklabel_extents(renderer)
8354-
self.xaxis._update_label_position([bbx1], [bbx2])
8355-
bb.extend([bbx1, bbx2])
8356-
if self.yaxis.get_visible():
8357-
artists.append(self.yaxis.label)
8358-
bby1, bby2 = self.yaxis.get_ticklabel_extents(renderer)
8359-
self.yaxis._update_label_position([bby1], [bby2])
8360-
bb.extend([bby1, bby2])
8351+
if self.title.get_visible():
8352+
bb.append(self.title.get_window_extent(renderer))
83618353

8354+
bb_xaxis = self.xaxis.get_tightbbox(renderer)
8355+
if bb_xaxis: bb.append(bb_xaxis)
83628356

8363-
bb.extend([c.get_window_extent(renderer) for c in artists if c.get_visible()])
8357+
bb_yaxis = self.yaxis.get_tightbbox(renderer)
8358+
if bb_yaxis: bb.append(bb_yaxis)
83648359

83658360
_bbox = mtransforms.Bbox.union([b for b in bb if b.width!=0 or b.height!=0])
83668361

lib/matplotlib/axis.py

Lines changed: 90 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)