Revision: 7891
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7891&view=rev
Author: leejjoon
Date: 2009-10-19 04:17:32 +0000 (Mon, 19 Oct 2009)
Log Message:
-----------
Add "use_clabeltext" option to clabel.
Modified Paths:
--------------
trunk/matplotlib/CHANGELOG
trunk/matplotlib/lib/matplotlib/contour.py
Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG 2009-10-17 13:02:30 UTC (rev 7890)
+++ trunk/matplotlib/CHANGELOG 2009-10-19 04:17:32 UTC (rev 7891)
@@ -1,3 +1,7 @@
+2009-10-19 Add "use_clabeltext" option to clabel. If True, clabels
+ will be created with ClabelText class, which recalculates
+ rotation angle of the label during the drawing time.
+
2009-10-16 Make AutoDateFormatter actually use any specified
timezone setting.This was only working correctly
when no timezone was specified. - RMM
Modified: trunk/matplotlib/lib/matplotlib/contour.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/contour.py 2009-10-17 13:02:30 UTC (rev
7890)
+++ trunk/matplotlib/lib/matplotlib/contour.py 2009-10-19 04:17:32 UTC (rev
7891)
@@ -29,6 +29,21 @@
# per level.
+class ClabelText(text.Text):
+ """
+ Unlike the ordinary text, the get_rotation returns an updated
+ angle in the pixel coordinate assuming that the input rotation is
+ an angle in data coordinate (or whatever transform set).
+ """
+ def get_rotation(self):
+ angle = text.Text.get_rotation(self)
+ trans = self.get_transform()
+ x, y = self.get_position()
+ new_angles = trans.transform_angles(np.array([angle]),
+ np.array([[x, y]]))
+ return new_angles[0]
+
+
class ContourLabeler:
'''Mixin to provide labelling capability to ContourSet'''
@@ -95,6 +110,12 @@
if *True* (default), label rotations will always be plus
or minus 90 degrees from level.
+ *use_clabeltext*:
+ if *True* (default is False), ClabelText class (instead of
+ matplotlib.Text) is used to create labels. ClabelText
+ recalculates rotation angles of texts during the drawing time,
+ therefore this can be used if aspect of the axes changes.
+
.. plot:: mpl_examples/pylab_examples/contour_demo.py
"""
@@ -117,6 +138,8 @@
self.labelFmt = kwargs.get('fmt', '%1.3f')
_colors = kwargs.get('colors', None)
+ self._use_clabeltext = kwargs.get('use_clabeltext', False)
+
# Detect if manual selection is desired and remove from argument list
self.labelManual=kwargs.get('manual',False)
@@ -435,13 +458,29 @@
return (rotation,nlc)
-
- def add_label(self,x,y,rotation,lev,cvalue):
+ def _get_label_text(self,x,y,rotation):
dx,dy = self.ax.transData.inverted().transform_point((x,y))
t = text.Text(dx, dy, rotation = rotation,
horizontalalignment='center',
verticalalignment='center')
+ return t
+ def _get_label_clabeltext(self,x,y,rotation):
+ # x, y, rotation is given in pixel coordinate. Convert them to
+ # the data coordinate and create a label using ClabelText
+ # class. This way, the roation of the clabel is along the
+ # contour line always.
+ transDataInv = self.ax.transData.inverted()
+ dx,dy = transDataInv.transform_point((x,y))
+ drotation = transDataInv.transform_angles(np.array([rotation]),
+ np.array([[x,y]]))
+ t = ClabelText(dx, dy, rotation = drotation[0],
+ horizontalalignment='center',
+ verticalalignment='center')
+
+ return t
+
+ def _add_label(self, t, x, y, lev, cvalue):
color = self.labelMappable.to_rgba(cvalue,alpha=self.alpha)
_text = self.get_text(lev,self.labelFmt)
@@ -453,6 +492,28 @@
# Add label to plot here - useful for manual mode label selection
self.ax.add_artist(t)
+ def add_label(self,x,y,rotation,lev,cvalue):
+ """
+ Addd contour label using Text class.
+ """
+
+ t = self._get_label_text(x,y,rotation)
+ self._add_label(t, x, y, lev, cvalue)
+
+ def add_label_clabeltext(self,x,y,rotation,lev,cvalue):
+ """
+ Addd contour label using ClabelText class.
+ """
+ # x, y, rotation is given in pixel coordinate. Convert them to
+ # the data coordinate and create a label using ClabelText
+ # class. This way, the roation of the clabel is along the
+ # contour line always.
+
+ t = self._get_label_clabeltext(x,y,rotation)
+ self._add_label(t, x, y, lev, cvalue)
+
+
+
def pop_label(self,index=-1):
'''Defaults to removing last label, but any index can be supplied'''
self.labelCValues.pop(index)
@@ -462,6 +523,11 @@
def labels(self, inline, inline_spacing):
trans = self.ax.transData # A bit of shorthand
+ if self._use_clabeltext:
+ add_label = self.add_label_clabeltext
+ else:
+ add_label = self.add_label
+
for icon, lev, fsize, cvalue in zip(
self.labelIndiceList, self.labelLevelList, self.labelFontSizeList,
self.labelCValueList ):
@@ -493,7 +559,7 @@
inline_spacing )
# Actually add the label
- self.add_label(x,y,rotation,lev,cvalue)
+ add_label(x,y,rotation,lev,cvalue)
# If inline, add new contours
if inline:
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Come build with us! The BlackBerry(R) Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9 - 12, 2009. Register now!
http://p.sf.net/sfu/devconference
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins