diff --git a/CHANGELOG b/CHANGELOG index 5e1abfe99ebb..509eb2aefe21 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2013-10-27 Added get_rlabel_position and set_rlabel_position methods to + PolarAxes to control angular position of radial tick labels. + 2013-10-06 Add stride-based functions to mlab for easy creation of 2D arrays with less memory. diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py index e8738d522d8a..77865920acd5 100644 --- a/lib/matplotlib/projections/polar.py +++ b/lib/matplotlib/projections/polar.py @@ -234,6 +234,7 @@ def __init__(self, *args, **kwargs): self.resolution = kwargs.pop('resolution', 1) self._default_theta_offset = kwargs.pop('theta_offset', 0) self._default_theta_direction = kwargs.pop('theta_direction', 1) + self._default_rlabel_position = kwargs.pop('rlabel_position', 22.5) if self.resolution not in (None, 1): warnings.warn( @@ -324,7 +325,7 @@ def _set_lim_and_transforms(self): self.transData) # The r-axis labels are put at an angle and padded in the r-direction self._r_label_position = ScaledTranslation( - 22.5, 0.0, Affine2D()) + self._default_rlabel_position, 0.0, Affine2D()) self._yaxis_text_transform = ( self._r_label_position + Affine2D().scale(1.0 / 360.0, 1.0) + @@ -346,7 +347,7 @@ def get_yaxis_transform(self,which='grid'): return self._yaxis_transform def get_yaxis_text1_transform(self, pad): - angle = self._r_label_position.to_values()[4] + angle = self.get_rlabel_position() if angle < 90.: return self._yaxis_text_transform, 'bottom', 'left' elif angle < 180.: @@ -357,7 +358,7 @@ def get_yaxis_text1_transform(self, pad): return self._yaxis_text_transform, 'top', 'left' def get_yaxis_text2_transform(self, pad): - angle = self._r_label_position.to_values()[4] + angle = self.get_rlabel_position() if angle < 90.: return self._yaxis_text_transform, 'top', 'right' elif angle < 180.: @@ -454,6 +455,26 @@ def set_rlim(self, *args, **kwargs): kwargs['ymax'] = kwargs.pop('rmax') return self.set_ylim(*args, **kwargs) + def get_rlabel_position(self): + """ + Returns + ------- + float + The theta position of the radius labels in degrees. + """ + return self._r_label_position.to_values()[4] + + def set_rlabel_position(self, value): + """Updates the theta position of the radius labels. + + Parameters + ---------- + value : number + The angular position of the radius labels in degrees. + """ + self._r_label_position._t = (value, 0.0) + self._r_label_position.invalidate() + def set_yscale(self, *args, **kwargs): Axes.set_yscale(self, *args, **kwargs) self.yaxis.set_major_locator( @@ -543,9 +564,8 @@ def set_rgrids(self, radii, labels=None, angle=None, fmt=None, elif fmt is not None: self.yaxis.set_major_formatter(FormatStrFormatter(fmt)) if angle is None: - angle = self._r_label_position.to_values()[4] - self._r_label_position._t = (angle, 0.0) - self._r_label_position.invalidate() + angle = self.get_rlabel_position() + self.set_rlabel_position(angle) for t in self.yaxis.get_ticklabels(): t.update(kwargs) return self.yaxis.get_gridlines(), self.yaxis.get_ticklabels() @@ -597,7 +617,7 @@ def can_pan(self) : return True def start_pan(self, x, y, button): - angle = np.deg2rad(self._r_label_position.to_values()[4]) + angle = np.deg2rad(self.get_rlabel_position()) mode = '' if button == 1: epsilon = np.pi / 45.0 @@ -611,7 +631,7 @@ def start_pan(self, x, y, button): rmax = self.get_rmax(), trans = self.transData.frozen(), trans_inverse = self.transData.inverted().frozen(), - r_label_angle = self._r_label_position.to_values()[4], + r_label_angle = self.get_rlabel_position(), x = x, y = y, mode = mode @@ -635,9 +655,7 @@ def drag_pan(self, button, key, x, y): else: dt = dt0 * -1.0 dt = (dt / np.pi) * 180.0 - - self._r_label_position._t = (p.r_label_angle - dt, 0.0) - self._r_label_position.invalidate() + self.set_rlabel_position(p.r_label_angle - dt) trans, vert1, horiz1 = self.get_yaxis_text1_transform(0.0) trans, vert2, horiz2 = self.get_yaxis_text2_transform(0.0) diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_rlabel_position.pdf b/lib/matplotlib/tests/baseline_images/test_axes/polar_rlabel_position.pdf new file mode 100644 index 000000000000..0d24bef37f45 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_axes/polar_rlabel_position.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_rlabel_position.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_rlabel_position.png new file mode 100644 index 000000000000..1898bb1ccf28 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_axes/polar_rlabel_position.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_rlabel_position.svg b/lib/matplotlib/tests/baseline_images/test_axes/polar_rlabel_position.svg new file mode 100644 index 000000000000..c1ec7e705dc2 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/polar_rlabel_position.svg @@ -0,0 +1,1272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 72f8776c7820..8ae8207e3a2d 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -396,6 +396,12 @@ def test_polar_theta_position(): ax.set_theta_zero_location("NW") ax.set_theta_direction('clockwise') +@image_comparison(baseline_images=['polar_rlabel_position']) +def test_polar_rlabel_position(): + fig = plt.figure() + ax = fig.add_subplot(111, projection='polar') + ax.set_rlabel_position(315) + @image_comparison(baseline_images=['axvspan_epoch']) def test_axvspan_epoch(): from datetime import datetime