@@ -54,7 +54,7 @@ def transform_non_affine(self, tr):
54
54
t += self ._axis .get_theta_offset ()
55
55
56
56
if self ._use_rmin and self ._axis is not None :
57
- r = r - self ._axis .viewLim . ymin
57
+ r = r - self ._axis .get_rorigin ()
58
58
mask = r < 0
59
59
x [:] = np .where (mask , np .nan , r * np .cos (t ))
60
60
y [:] = np .where (mask , np .nan , r * np .sin (t ))
@@ -146,7 +146,7 @@ def transform_non_affine(self, xy):
146
146
theta %= 2 * np .pi
147
147
148
148
if self ._use_rmin and self ._axis is not None :
149
- r += self ._axis .viewLim . ymin
149
+ r += self ._axis .get_rorigin ()
150
150
151
151
return np .concatenate ((theta , r ), 1 )
152
152
transform_non_affine .__doc__ = \
@@ -198,13 +198,14 @@ def __call__(self):
198
198
show_all = True
199
199
# Ensure previous behaviour with full circle views.
200
200
if self ._axes :
201
- rmin = self ._axes .get_rmin ()
202
- show_all = False
201
+ rorigin = self ._axes .get_rorigin ()
202
+ if self ._axes .get_rmin () <= rorigin :
203
+ show_all = False
203
204
204
205
if show_all :
205
206
return self .base ()
206
207
else :
207
- return [tick for tick in self .base () if tick > rmin ]
208
+ return [tick for tick in self .base () if tick > rorigin ]
208
209
209
210
def autoscale (self ):
210
211
return self .base .autoscale ()
@@ -259,11 +260,15 @@ def cla(self):
259
260
260
261
self .grid (rcParams ['polaraxes.grid' ])
261
262
self .xaxis .set_ticks_position ('none' )
263
+ inner = self .spines .get ('inner' , None )
264
+ if inner :
265
+ inner .set_visible (False )
262
266
self .yaxis .set_ticks_position ('none' )
263
267
self .yaxis .set_tick_params (label1On = True )
264
268
# Why do we need to turn on yaxis tick labels, but
265
269
# xaxis tick labels are already on?
266
270
271
+ self .set_rorigin (None )
267
272
self .set_theta_offset (self ._default_theta_offset )
268
273
self .set_theta_direction (self ._default_theta_direction )
269
274
@@ -307,6 +312,8 @@ def _set_lim_and_transforms(self):
307
312
self .transProjection = self .PolarTransform (
308
313
self ,
309
314
_apply_theta_transforms = False )
315
+ # Add dependency on rorigin.
316
+ self .transProjection .set_children (self ._originViewLim )
310
317
311
318
# This one is not aware of rmin
312
319
self .transPureProjection = self .PolarTransform (
@@ -316,7 +323,8 @@ def _set_lim_and_transforms(self):
316
323
317
324
# An affine transformation on the data, generally to limit the
318
325
# range of the axes
319
- self .transProjectionAffine = self .PolarAffine (self .transScale , self .viewLim )
326
+ self .transProjectionAffine = self .PolarAffine (self .transScale ,
327
+ self ._originViewLim )
320
328
321
329
# The complete data transformation stack -- from data all the
322
330
# way to display coordinates
@@ -397,24 +405,35 @@ def get_yaxis_text2_transform(self, pad):
397
405
else :
398
406
return self ._yaxis_text_transform , 'bottom' , 'right'
399
407
400
- def _gen_axes_patch (self ):
401
- return mpatches .Circle ((0.5 , 0.5 ), 0.5 )
408
+ def draw (self , * args , ** kwargs ):
409
+ rmin , rmax = self .viewLim .intervaly
410
+ rorigin = self .get_rorigin ()
411
+ inner = self .spines .get ('inner' , None )
402
412
403
- def _gen_axes_spines (self ):
404
- return {'polar' :mspines .Spine .circular_spine (self ,
405
- (0.5 , 0.5 ), 0.5 )}
413
+ if isinstance (self .patch , mpatches .Wedge ):
414
+ # Backwards-compatibility: Any subclassed Axes might override the
415
+ # patch to not be the Wedge that PolarAxes uses.
416
+ if rorigin < rmin :
417
+ width = (rmax - rmin ) / (rmax - rorigin ) * 0.5
418
+ else :
419
+ width = 0.5
420
+ self .patch .set_width (width )
406
421
407
- def set_rmax (self , rmax ):
408
- self .viewLim .y1 = rmax
422
+ inner_width = 0.5 - width
423
+ if inner :
424
+ inner .set_patch_circle ((0.5 , 0.5 ), inner_width )
425
+ inner .set_visible (inner_width != 0.0 )
409
426
410
- def get_rmax (self ):
411
- return self .viewLim .ymax
427
+ Axes .draw (self , * args , ** kwargs )
412
428
413
- def set_rmin (self , rmin ):
414
- self . viewLim . y0 = rmin
429
+ def _gen_axes_patch (self ):
430
+ return mpatches . Wedge (( 0.5 , 0.5 ), 0.5 , 0.0 , 360.0 )
415
431
416
- def get_rmin (self ):
417
- return self .viewLim .ymin
432
+ def _gen_axes_spines (self ):
433
+ return {'polar' : mspines .Spine .circular_spine (self ,
434
+ (0.5 , 0.5 ), 0.5 ),
435
+ 'inner' : mspines .Spine .circular_spine (self ,
436
+ (0.5 , 0.5 ), 0.0 )}
418
437
419
438
def set_theta_offset (self , offset ):
420
439
"""
@@ -481,6 +500,24 @@ def get_theta_direction(self):
481
500
"""
482
501
return self ._direction .get_matrix ()[0 , 0 ]
483
502
503
+ def set_rmax (self , rmax ):
504
+ self .viewLim .y1 = rmax
505
+
506
+ def get_rmax (self ):
507
+ return self .viewLim .ymax
508
+
509
+ def set_rmin (self , rmin ):
510
+ self .viewLim .y0 = rmin
511
+
512
+ def get_rmin (self ):
513
+ return self .viewLim .ymin
514
+
515
+ def set_rorigin (self , rorigin ):
516
+ self ._originViewLim .locked_y0 = rorigin
517
+
518
+ def get_rorigin (self ):
519
+ return self ._originViewLim .y0
520
+
484
521
def set_rlim (self , * args , ** kwargs ):
485
522
if 'rmin' in kwargs :
486
523
kwargs ['ymin' ] = kwargs .pop ('rmin' )
0 commit comments