Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

position of text annotations looses unit information #4904

Merged
merged 2 commits into from Aug 22, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions doc/api/api_changes/2015-08-17-JRE.rst
@@ -0,0 +1,11 @@
Preserve units with Text position
`````````````````````````````````

Previously the 'get_position' method on Text would strip away unit information
even though the units were still present. There was no inherent need to do
this, so it has been changed so that unit data (if present) will be preserved.
Essentially a call to 'get_position' will return the exact value from a call to
'set_position'.

If you wish to get the old behaviour, then you can use the new method called
'get_unitless_position'.
36 changes: 26 additions & 10 deletions lib/matplotlib/text.py
Expand Up @@ -280,7 +280,7 @@ def contains(self, mouseevent):

def _get_xy_display(self):
'get the (possibly unit converted) transformed x, y in display coords'
x, y = self.get_position()
x, y = self.get_unitless_position()
return self.get_transform().transform_point((x, y))

def _get_multialignment(self):
Expand Down Expand Up @@ -536,8 +536,8 @@ def update_bbox_position_size(self, renderer):

trans = self.get_transform()

# don't use self.get_position here, which refers to text position
# in Text, and dash position in TextWithDash:
# don't use self.get_unitless_position here, which refers to text
# position in Text, and dash position in TextWithDash:
posx = float(self.convert_xunits(self._x))
posy = float(self.convert_yunits(self._y))

Expand Down Expand Up @@ -877,12 +877,20 @@ def get_horizontalalignment(self):
"""
return self._horizontalalignment

def get_position(self):
"Return the position of the text as a tuple (*x*, *y*)"
def get_unitless_position(self):
"Return the unitless position of the text as a tuple (*x*, *y*)"
# This will get the position with all unit information stripped away.
# This is here for convienience since it is done in several locations.
x = float(self.convert_xunits(self._x))
y = float(self.convert_yunits(self._y))
return x, y

def get_position(self):
"Return the position of the text as a tuple (*x*, *y*)"
# This should return the same data (possible unitized) as was
# specified with 'set_x' and 'set_y'.
return self._x, self._y

def get_prop_tup(self):
"""
Return a hashable tuple of properties.
Expand All @@ -891,7 +899,7 @@ def get_prop_tup(self):
want to cache derived information about text (e.g., layouts) and
need to know if the text has changed.
"""
x, y = self.get_position()
x, y = self.get_unitless_position()
return (x, y, self.get_text(), self._color,
self._verticalalignment, self._horizontalalignment,
hash(self._fontproperties),
Expand Down Expand Up @@ -950,7 +958,7 @@ def get_window_extent(self, renderer=None, dpi=None):
raise RuntimeError('Cannot get window extent w/o renderer')

bbox, info, descent = self._get_layout(self._renderer)
x, y = self.get_position()
x, y = self.get_unitless_position()
x, y = self.get_transform().transform_point((x, y))
bbox = bbox.translated(x, y)
if dpi is not None:
Expand Down Expand Up @@ -1365,12 +1373,20 @@ def __init__(self,

#self.set_bbox(dict(pad=0))

def get_position(self):
"Return the position of the text as a tuple (*x*, *y*)"
def get_unitless_position(self):
"Return the unitless position of the text as a tuple (*x*, *y*)"
# This will get the position with all unit information stripped away.
# This is here for convienience since it is done in several locations.
x = float(self.convert_xunits(self._dashx))
y = float(self.convert_yunits(self._dashy))
return x, y

def get_position(self):
"Return the position of the text as a tuple (*x*, *y*)"
# This should return the same data (possibly unitized) as was
# specified with set_x and set_y
return self._dashx, self._dashy

def get_prop_tup(self):
"""
Return a hashable tuple of properties.
Expand Down Expand Up @@ -1402,7 +1418,7 @@ def update_coords(self, renderer):
with respect to the actual canvas's coordinates we need to map
back and forth.
"""
dashx, dashy = self.get_position()
dashx, dashy = self.get_unitless_position()
dashlength = self.get_dashlength()
# Shortcircuit this process if we don't have a dash
if dashlength == 0.0:
Expand Down