@@ -3522,10 +3522,11 @@ def _upcast_err(err):
3522
3522
eb_cap_style ['color' ] = ecolor
3523
3523
3524
3524
barcols = []
3525
- caplines = []
3525
+ caplines = { 'x' : [], 'y' : []}
3526
3526
3527
3527
# Vectorized fancy-indexer.
3528
- def apply_mask (arrays , mask ): return [array [mask ] for array in arrays ]
3528
+ def apply_mask (arrays , mask ):
3529
+ return [array [mask ] for array in arrays ]
3529
3530
3530
3531
# dep: dependent dataset, indep: independent dataset
3531
3532
for (dep_axis , dep , err , lolims , uplims , indep , lines_func ,
@@ -3556,9 +3557,17 @@ def apply_mask(arrays, mask): return [array[mask] for array in arrays]
3556
3557
# return dep - elow * ~lolims, dep + ehigh * ~uplims
3557
3558
# except that broadcast_to would strip units.
3558
3559
low , high = dep + np .row_stack ([- (1 - lolims ), 1 - uplims ]) * err
3559
-
3560
- barcols .append (lines_func (
3561
- * apply_mask ([indep , low , high ], everymask ), ** eb_lines_style ))
3560
+ if self .name == "polar" :
3561
+ delta_r = 0
3562
+ if dep_axis == "x" :
3563
+ delta_r = indep * (1 - np .cos ((high - low ).astype (float )/ 2 ))
3564
+ barcols .append (lines_func (
3565
+ * apply_mask ([indep + delta_r , low , high ], everymask ),
3566
+ ** eb_lines_style ))
3567
+ else :
3568
+ barcols .append (lines_func (
3569
+ * apply_mask ([indep , low , high ], everymask ),
3570
+ ** eb_lines_style ))
3562
3571
# Normal errorbars for points without upper/lower limits.
3563
3572
nolims = ~ (lolims | uplims )
3564
3573
if nolims .any () and capsize > 0 :
@@ -3571,7 +3580,7 @@ def apply_mask(arrays, mask): return [array[mask] for array in arrays]
3571
3580
line = mlines .Line2D (indep_masked , indep_masked ,
3572
3581
marker = marker , ** eb_cap_style )
3573
3582
line .set (** {f"{ dep_axis } data" : lh_masked })
3574
- caplines .append (line )
3583
+ caplines [ dep_axis ] .append (line )
3575
3584
for idx , (lims , hl ) in enumerate ([(lolims , high ), (uplims , low )]):
3576
3585
if not lims .any ():
3577
3586
continue
@@ -3585,15 +3594,38 @@ def apply_mask(arrays, mask): return [array[mask] for array in arrays]
3585
3594
line = mlines .Line2D (x_masked , y_masked ,
3586
3595
marker = hlmarker , ** eb_cap_style )
3587
3596
line .set (** {f"{ dep_axis } data" : hl_masked })
3588
- caplines .append (line )
3597
+ caplines [ dep_axis ] .append (line )
3589
3598
if capsize > 0 :
3590
- caplines .append (mlines .Line2D (
3599
+ caplines [ dep_axis ] .append (mlines .Line2D (
3591
3600
x_masked , y_masked , marker = marker , ** eb_cap_style ))
3592
-
3593
- for l in caplines :
3594
- self .add_line (l )
3601
+ if self .name == 'polar' :
3602
+ for axis in caplines :
3603
+ if not caplines [axis ]:
3604
+ continue
3605
+ lo , hi = caplines [axis ]
3606
+ for (lo_theta , lo_r ,
3607
+ hi_theta , hi_r ) in zip (
3608
+ lo .get_xdata (), lo .get_ydata (),
3609
+ hi .get_xdata (), hi .get_ydata ()):
3610
+ # Rotate caps to be perpendicular to the error bars
3611
+ rotation = (lo_theta + hi_theta )/ 2
3612
+ if axis == 'x' :
3613
+ lo_r += lo_r * (1 - np .cos ((hi_theta - lo_theta )/ 2 ))
3614
+ hi_r += hi_r * (1 - np .cos ((hi_theta - lo_theta )/ 2 ))
3615
+ rotation += np .pi / 2
3616
+ ms = mmarkers .MarkerStyle (marker = marker )
3617
+ ms ._transform = mtransforms .Affine2D ().rotate (rotation )
3618
+ self .add_line (mlines .Line2D ([lo_theta ], [lo_r ],
3619
+ marker = ms , ** eb_cap_style ))
3620
+ self .add_line (mlines .Line2D ([hi_theta ], [hi_r ],
3621
+ marker = ms , ** eb_cap_style ))
3622
+ else :
3623
+ for axis in caplines :
3624
+ for l in caplines [axis ]:
3625
+ self .add_line (l )
3595
3626
3596
3627
self ._request_autoscale_view ()
3628
+ caplines = caplines ['x' ] + caplines ['y' ]
3597
3629
errorbar_container = ErrorbarContainer (
3598
3630
(data_line , tuple (caplines ), tuple (barcols )),
3599
3631
has_xerr = (xerr is not None ), has_yerr = (yerr is not None ),
0 commit comments