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

Skip to content

Commit cf2821a

Browse files
committed
tight_layout support for axisartist toolkit
1 parent e08c2ff commit cf2821a

File tree

2 files changed

+181
-12
lines changed

2 files changed

+181
-12
lines changed

lib/mpl_toolkits/axisartist/axis_artist.py

Lines changed: 170 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ def get_window_extent(self, renderer):
451451
offset_tr.translate(dx, dy)
452452
self.set_rotation(text_ref_angle+angle_orig)
453453

454-
bbox = super(LabelBase, self).get_window_extent(renderer)
454+
bbox = super(LabelBase, self).get_window_extent(renderer).frozen()
455455

456456
offset_tr.clear()
457457

@@ -619,6 +619,20 @@ def draw(self, renderer):
619619
super(AxisLabel, self).draw(renderer)
620620

621621

622+
def get_window_extent(self, renderer):
623+
624+
if not self.get_visible():
625+
return
626+
627+
pad = renderer.points_to_pixels(self.get_pad())
628+
r = self._get_external_pad() + pad
629+
self._set_offset_radius(r)
630+
631+
bb = super(AxisLabel, self).get_window_extent(renderer)
632+
633+
return bb
634+
635+
622636
class TickLabels(AxisLabel, AttributeCopier): # mtext.Text
623637
"""
624638
Tick Labels. While derived from Text, this single artist draws all
@@ -762,7 +776,7 @@ def draw(self, renderer):
762776
return
763777

764778
r, total_width = self._get_ticklabels_offsets(renderer,
765-
self._axis_direction)
779+
self._axis_direction)
766780

767781
#self._set_external_pad(r+self._get_external_pad())
768782
pad = self._get_external_pad() + \
@@ -788,6 +802,10 @@ def set_locs_angles_labels(self, locs_angles_labels):
788802

789803
def get_window_extents(self, renderer):
790804

805+
if not self.get_visible():
806+
self._axislabel_pad = self._get_external_pad()
807+
return []
808+
791809
bboxes = []
792810

793811
r, total_width = self._get_ticklabels_offsets(renderer,
@@ -806,6 +824,9 @@ def get_window_extents(self, renderer):
806824
bb = LabelBase.get_window_extent(self, renderer)
807825
bboxes.append(bb)
808826

827+
self._axislabel_pad = total_width \
828+
+ pad # the value saved will be used to draw axislabel.
829+
809830
return bboxes
810831

811832

@@ -1210,8 +1231,69 @@ def _get_tick_info(self, tick_iter):
12101231
return ticks_loc_angle, ticklabels_loc_angle_label
12111232

12121233

1234+
def _update_ticks(self, renderer):
1235+
1236+
1237+
# set extra pad for major and minor ticklabels:
1238+
# use ticksize of majorticks even for minor ticks. not clear what is best.
1239+
1240+
dpi_cor = renderer.points_to_pixels(1.)
1241+
if self.major_ticks.get_visible() and self.major_ticks.get_tick_out():
1242+
self.major_ticklabels._set_external_pad(self.major_ticks._ticksize*dpi_cor)
1243+
self.minor_ticklabels._set_external_pad(self.major_ticks._ticksize*dpi_cor)
1244+
else:
1245+
self.major_ticklabels._set_external_pad(0)
1246+
self.minor_ticklabels._set_external_pad(0)
1247+
1248+
1249+
majortick_iter, minortick_iter = \
1250+
self._axis_artist_helper.get_tick_iterators(self.axes)
1251+
1252+
tick_loc_angle, ticklabel_loc_angle_label \
1253+
= self._get_tick_info(majortick_iter)
1254+
1255+
self.major_ticks.set_locs_angles(tick_loc_angle)
1256+
self.major_ticklabels.set_locs_angles_labels(ticklabel_loc_angle_label)
1257+
1258+
#self.major_ticks.draw(renderer)
1259+
#self.major_ticklabels.draw(renderer)
1260+
1261+
1262+
# minor ticks
1263+
tick_loc_angle, ticklabel_loc_angle_label \
1264+
= self._get_tick_info(minortick_iter)
1265+
1266+
self.minor_ticks.set_locs_angles(tick_loc_angle)
1267+
self.minor_ticklabels.set_locs_angles_labels(ticklabel_loc_angle_label)
1268+
1269+
#self.minor_ticks.draw(renderer)
1270+
#self.minor_ticklabels.draw(renderer)
1271+
1272+
1273+
#if (self.major_ticklabels.get_visible() or self.minor_ticklabels.get_visible()):
1274+
# self._draw_offsetText(renderer)
1275+
1276+
return self.major_ticklabels.get_window_extents(renderer)
1277+
1278+
12131279
def _draw_ticks(self, renderer):
12141280

1281+
extents = self._update_ticks(renderer)
1282+
1283+
self.major_ticks.draw(renderer)
1284+
self.major_ticklabels.draw(renderer)
1285+
1286+
self.minor_ticks.draw(renderer)
1287+
self.minor_ticklabels.draw(renderer)
1288+
1289+
1290+
if (self.major_ticklabels.get_visible() or self.minor_ticklabels.get_visible()):
1291+
self._draw_offsetText(renderer)
1292+
1293+
return extents
1294+
1295+
def _draw_ticks2(self, renderer):
1296+
12151297

12161298
# set extra pad for major and minor ticklabels:
12171299
# use ticksize of majorticks even for minor ticks. not clear what is best.
@@ -1319,7 +1401,51 @@ def _init_label(self, **kw):
13191401
labelpad = kw.get("labelpad", 5)
13201402
self.label.set_pad(labelpad)
13211403

1404+
1405+
def _update_label(self, renderer):
1406+
1407+
if not self.label.get_visible():
1408+
return
1409+
1410+
fontprops = font_manager.FontProperties(size=rcParams['axes.labelsize'])
1411+
1412+
#pad_points = self.major_tick_pad
1413+
1414+
#print self._ticklabel_add_angle - self._axislabel_add_angle
1415+
#if abs(self._ticklabel_add_angle - self._axislabel_add_angle)%360 > 90:
1416+
if self._ticklabel_add_angle != self._axislabel_add_angle:
1417+
if (self.major_ticks.get_visible() and not self.major_ticks.get_tick_out()) \
1418+
or \
1419+
(self.minor_ticks.get_visible() and not self.major_ticks.get_tick_out()):
1420+
axislabel_pad = self.major_ticks._ticksize
1421+
else:
1422+
axislabel_pad = 0
1423+
else:
1424+
axislabel_pad = max([self.major_ticklabels._axislabel_pad,
1425+
self.minor_ticklabels._axislabel_pad])
1426+
1427+
1428+
#label_offset = axislabel_pad + self.LABELPAD
1429+
1430+
#self.label._set_offset_radius(label_offset)
1431+
self.label._set_external_pad(axislabel_pad)
1432+
1433+
xy, angle_tangent = self._axis_artist_helper.get_axislabel_pos_angle(self.axes)
1434+
if xy is None: return
1435+
1436+
angle_label = angle_tangent - 90
1437+
1438+
1439+
x, y = xy
1440+
self.label._set_ref_angle(angle_label+self._axislabel_add_angle)
1441+
self.label.set(x=x, y=y)
1442+
1443+
13221444
def _draw_label(self, renderer):
1445+
self._update_label(renderer)
1446+
self.label.draw(renderer)
1447+
1448+
def _draw_label2(self, renderer):
13231449

13241450
if not self.label.get_visible():
13251451
return
@@ -1364,6 +1490,48 @@ def set_label(self, s):
13641490
self.label.set_text(s)
13651491

13661492

1493+
1494+
def get_tightbbox(self, renderer):
1495+
if not self.get_visible(): return
1496+
1497+
self._axis_artist_helper.update_lim(self.axes)
1498+
1499+
dpi_cor = renderer.points_to_pixels(1.)
1500+
self.dpi_transform.clear().scale(dpi_cor, dpi_cor)
1501+
1502+
1503+
bb = []
1504+
1505+
self._update_ticks(renderer)
1506+
1507+
#if self.major_ticklabels.get_visible():
1508+
bb.extend(self.major_ticklabels.get_window_extents(renderer))
1509+
#if self.minor_ticklabels.get_visible():
1510+
bb.extend(self.minor_ticklabels.get_window_extents(renderer))
1511+
1512+
1513+
self._update_label(renderer)
1514+
1515+
#if self.label.get_visible():
1516+
bb.append(self.label.get_window_extent(renderer))
1517+
bb.append(self.offsetText.get_window_extent(renderer))
1518+
1519+
bb = [b for b in bb if b and (b.width!=0 or b.height!=0)]
1520+
if bb:
1521+
_bbox = Bbox.union(bb)
1522+
return _bbox
1523+
else:
1524+
return None
1525+
1526+
#self._draw_line(renderer)
1527+
1528+
#self._draw_ticks(renderer)
1529+
1530+
#self._draw_offsetText(renderer)
1531+
#self._draw_label(renderer)
1532+
1533+
1534+
13671535
@allow_rasterization
13681536
def draw(self, renderer):
13691537
'Draw the axis lines, tick lines and labels'

lib/mpl_toolkits/axisartist/axislines.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -746,22 +746,23 @@ def get_tightbbox(self, renderer):
746746
if not axisline.get_visible():
747747
continue
748748

749-
if axisline.label.get_visible():
750-
bb.append(axisline.label.get_window_extent(renderer))
749+
bb.append(axisline.get_tightbbox(renderer))
750+
# if axisline.label.get_visible():
751+
# bb.append(axisline.label.get_window_extent(renderer))
751752

752753

753-
if axisline.major_ticklabels.get_visible():
754-
bb.extend(axisline.major_ticklabels.get_window_extents(renderer))
755-
if axisline.minor_ticklabels.get_visible():
756-
bb.extend(axisline.minor_ticklabels.get_window_extents(renderer))
757-
if axisline.major_ticklabels.get_visible() or \
758-
axisline.minor_ticklabels.get_visible():
759-
bb.append(axisline.offsetText.get_window_extent(renderer))
754+
# if axisline.major_ticklabels.get_visible():
755+
# bb.extend(axisline.major_ticklabels.get_window_extents(renderer))
756+
# if axisline.minor_ticklabels.get_visible():
757+
# bb.extend(axisline.minor_ticklabels.get_window_extents(renderer))
758+
# if axisline.major_ticklabels.get_visible() or \
759+
# axisline.minor_ticklabels.get_visible():
760+
# bb.append(axisline.offsetText.get_window_extent(renderer))
760761

761762
#bb.extend([c.get_window_extent(renderer) for c in artists \
762763
# if c.get_visible()])
763764

764-
_bbox = Bbox.union([b for b in bb if b.width!=0 or b.height!=0])
765+
_bbox = Bbox.union([b for b in bb if b and (b.width!=0 or b.height!=0)])
765766

766767
return _bbox
767768

0 commit comments

Comments
 (0)