From: <lee...@us...> - 2009-05-18 19:19:43
|
Revision: 7120 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7120&view=rev Author: leejjoon Date: 2009-05-18 19:19:33 +0000 (Mon, 18 May 2009) Log Message: ----------- Fix the linespacing bug of multiline text (#1239682) Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/examples/pylab_examples/multiline.py trunk/matplotlib/lib/matplotlib/text.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2009-05-18 17:25:46 UTC (rev 7119) +++ trunk/matplotlib/CHANGELOG 2009-05-18 19:19:33 UTC (rev 7120) @@ -1,3 +1,6 @@ +2009-05-18 Fix the linespacing bug of multiline text (#1239682). See + examples/pylab_examples/multiline.py -JJL + 2009-05-18 Add *annotation_clip* attr. for text.Annotation class. If True, annotation is only drawn when the annotated point is inside the axes area. -JJL Modified: trunk/matplotlib/examples/pylab_examples/multiline.py =================================================================== --- trunk/matplotlib/examples/pylab_examples/multiline.py 2009-05-18 17:25:46 UTC (rev 7119) +++ trunk/matplotlib/examples/pylab_examples/multiline.py 2009-05-18 19:19:33 UTC (rev 7120) @@ -1,15 +1,46 @@ #!/usr/bin/env python from pylab import * +#from matplotlib.pyplot import * +#from numpy import arange -plot(arange(10)) -xlabel('this is a xlabel\n(with newlines!)') -ylabel('this is vertical\ntest', multialignment='center') -#ylabel('this is another!') -text(2, 7,'this is\nyet another test', - rotation=45, - horizontalalignment = 'center', - verticalalignment = 'top', - multialignment = 'center') +if 1: + figure(figsize=(7, 4)) + ax = subplot(121) + ax.set_aspect(1) + plot(arange(10)) + xlabel('this is a xlabel\n(with newlines!)') + ylabel('this is vertical\ntest', multialignment='center') + #ylabel('this is another!') + text(2, 7,'this is\nyet another test', + rotation=45, + horizontalalignment = 'center', + verticalalignment = 'top', + multialignment = 'center') -grid(True) + grid(True) + + + + subplot(122) + + text(0.29, 0.7, "Mat\nTTp\n123", size=18, + va="baseline", ha="right", multialignment="left", + bbox=dict(fc="none")) + + text(0.34, 0.7, "Mag\nTTT\n123", size=18, + va="baseline", ha="left", multialignment="left", + bbox=dict(fc="none")) + + text(0.95, 0.7, "Mag\nTTT$^{A^A}$\n123", size=18, + va="baseline", ha="right", multialignment="left", + bbox=dict(fc="none")) + + xticks([0.2, 0.4, 0.6, 0.8, 1.], + ["Jan\n2009","Feb\n2009","Mar\n2009", "Apr\n2009", "May\n2009"]) + + axhline(0.7) + title("test line spacing for multiline text") + +subplots_adjust(bottom=0.25, top=0.8) +draw() show() Modified: trunk/matplotlib/lib/matplotlib/text.py =================================================================== --- trunk/matplotlib/lib/matplotlib/text.py 2009-05-18 17:25:46 UTC (rev 7119) +++ trunk/matplotlib/lib/matplotlib/text.py 2009-05-18 19:19:33 UTC (rev 7120) @@ -8,15 +8,15 @@ from matplotlib import cbook from matplotlib import rcParams -import artist -from artist import Artist -from cbook import is_string_like, maxdict -from font_manager import FontProperties -from patches import bbox_artist, YAArrow, FancyBboxPatch, \ +import matplotlib.artist as artist +from matplotlib.artist import Artist +from matplotlib.cbook import is_string_like, maxdict +from matplotlib.font_manager import FontProperties +from matplotlib.patches import bbox_artist, YAArrow, FancyBboxPatch, \ FancyArrowPatch, Rectangle -import transforms as mtransforms -from transforms import Affine2D, Bbox -from lines import Line2D +import matplotlib.transforms as mtransforms +from matplotlib.transforms import Affine2D, Bbox +from matplotlib.lines import Line2D import matplotlib.nxutils as nxutils @@ -227,6 +227,11 @@ self._linespacing = other._linespacing def _get_layout(self, renderer): + """ + return the extent (bbox) of the text together with + multile-alignment information. Note that it returns a extent + of a rotated text when necessary. + """ key = self.get_prop_tup() if key in self.cached: return self.cached[key] @@ -242,9 +247,9 @@ # Find full vertical extent of font, # including ascenders and descenders: - tmp, heightt, bl = renderer.get_text_width_height_descent( + tmp, lp_h, lp_bl = renderer.get_text_width_height_descent( 'lp', self._fontproperties, ismath=False) - offsety = heightt * self._linespacing + offsety = lp_h * self._linespacing baseline = None for i, line in enumerate(lines): @@ -254,8 +259,22 @@ if baseline is None: baseline = h - d whs[i] = w, h - horizLayout[i] = thisx, thisy, w, h - thisy -= offsety + + # For general multiline text, we will have a fixed spacing + # between the "baseline" of the upper line and "top" of + # the lower line (instead of the "bottom" of the upper + # line and "top" of the lower line) + + # For multiline text, increase the line spacing when the + # text net-height(excluding baseline) is larger than that + # of a "l" (e.g., use of superscripts), which seems + # what TeX does. + + d_yoffset = max(0, (h-d)-(lp_h-lp_bl)) + + horizLayout[i] = thisx, thisy-(d + d_yoffset), \ + w, h + thisy -= offsety + d_yoffset width = max(width, w) ymin = horizLayout[-1][1] @@ -1688,3 +1707,4 @@ artist.kwdocd['Annotation'] = Annotation.__init__.__doc__ + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |