From 379fd07765a2ee3aea6f5435c1992e8e3deb7440 Mon Sep 17 00:00:00 2001 From: James Evans Date: Tue, 11 Aug 2015 07:53:39 -0700 Subject: [PATCH 1/2] JRE - Artists do not properly guard against being removed from figures or Axes when tracking 'stale'. This will keep them from throwing an exception if they become stale after being removed from an Axes or Figure. --- lib/matplotlib/artist.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index e6d428fba997..eab31da586f2 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -69,11 +69,13 @@ def draw_wrapper(artist, renderer, *args, **kwargs): def _stale_figure_callback(self): - self.figure.stale = True + if self.figure: + self.figure.stale = True def _stale_axes_callback(self): - self.axes.stale = True + if self.axes: + self.axes.stale = True class Artist(object): From 9d17a6c0f9f19dd6eee3271e1eba8c24c6529069 Mon Sep 17 00:00:00 2001 From: James Evans Date: Tue, 11 Aug 2015 08:07:47 -0700 Subject: [PATCH 2/2] JRE - Text would incorrectly strip away units when querying the position after it was set. This fixes Text such that it will return the original data when asked and will only strip away the units when it is needed. --- lib/matplotlib/text.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 92f17a4c9f8f..778b5f590b7b 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -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): @@ -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)) @@ -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. @@ -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), @@ -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. @@ -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: