@@ -434,17 +434,20 @@ pie.plot = function(gd, cdpie) {
434
434
. classed ( 'slice' , true ) ;
435
435
slices . exit ( ) . remove ( ) ;
436
436
437
- var outsideTextQuadrants = [
438
- [ [ ] , [ ] ] , // y<0: x<0, x>=0
439
- [ [ ] , [ ] ] // y>=0: x<0, x>=0
440
- ] ;
437
+ var quadrants = [
438
+ [ [ ] , [ ] ] , // y<0: x<0, x>=0
439
+ [ [ ] , [ ] ] // y>=0: x<0, x>=0
440
+ ] ,
441
+ hasOutsideText = false ;
441
442
442
443
slices . each ( function ( pt ) {
443
444
if ( pt . hidden ) {
444
445
d3 . select ( this ) . selectAll ( 'path,g' ) . remove ( ) ;
445
446
return ;
446
447
}
447
448
449
+ quadrants [ pt . pxmid [ 1 ] < 0 ? 0 : 1 ] [ pt . pxmid [ 0 ] < 0 ? 0 : 1 ] . push ( pt ) ;
450
+
448
451
var cx = cd0 . cx + depthVector [ 0 ] ,
449
452
cy = cd0 . cy + depthVector [ 1 ] ,
450
453
sliceTop = d3 . select ( this ) ,
@@ -504,6 +507,9 @@ pie.plot = function(gd, cdpie) {
504
507
}
505
508
}
506
509
510
+ pt . cxFinal = cx ;
511
+ pt . cyFinal = cy ;
512
+
507
513
function arc ( start , finish , cw , scale ) {
508
514
return 'a' + ( scale * cd0 . r ) + ',' + ( scale * rSmall ) + ' ' + tiltAxis + ' ' +
509
515
pt . largeArc + ( cw ? ' 1 ' : ' 0 ' ) +
@@ -602,14 +608,12 @@ pie.plot = function(gd, cdpie) {
602
608
603
609
// save some stuff to use later ensure no labels overlap
604
610
if ( transform . outside ) {
605
- pt . cxFinal = cx ;
606
- pt . cyFinal = cy ;
607
611
pt . yLabelMin = translateY - textBB . height / 2 ;
608
612
pt . yLabelMid = translateY ;
609
613
pt . yLabelMax = translateY + textBB . height / 2 ;
610
614
pt . labelExtraX = 0 ;
611
615
pt . labelExtraY = 0 ;
612
- outsideTextQuadrants [ transform . y < 0 ? 0 : 1 ] [ transform . x < 0 ? 0 : 1 ] . push ( pt ) ;
616
+ hasOutsideText = true ;
613
617
}
614
618
615
619
sliceText . attr ( 'transform' ,
@@ -624,7 +628,7 @@ pie.plot = function(gd, cdpie) {
624
628
} ) ;
625
629
626
630
// now make sure no labels overlap (at least within one pie)
627
- scootLabels ( outsideTextQuadrants , trace ) ;
631
+ if ( hasOutsideText ) scootLabels ( quadrants , trace ) ;
628
632
slices . each ( function ( pt ) {
629
633
if ( pt . labelExtraX || pt . labelExtraY ) {
630
634
// first move the text to its new location
@@ -767,7 +771,7 @@ function transformOutsideText(textBB, pt) {
767
771
} ;
768
772
}
769
773
770
- function scootLabels ( outsideTextQuadrants , trace ) {
774
+ function scootLabels ( quadrants , trace ) {
771
775
var xHalf ,
772
776
yHalf ,
773
777
equatorFirst ,
@@ -778,7 +782,9 @@ function scootLabels(outsideTextQuadrants, trace) {
778
782
thisQuad ,
779
783
oppositeQuad ,
780
784
wholeSide ,
781
- i ;
785
+ i ,
786
+ thisQuadOutside ,
787
+ firstOppositeOutsidePt ;
782
788
783
789
function topFirst ( a , b ) { return a . pxmid [ 1 ] - b . pxmid [ 1 ] ; }
784
790
function bottomFirst ( a , b ) { return b . pxmid [ 1 ] - a . pxmid [ 1 ] ; }
@@ -847,20 +853,33 @@ function scootLabels(outsideTextQuadrants, trace) {
847
853
// first sort the array
848
854
// note this is a copy of cd, so cd itself doesn't get sorted
849
855
// but we can still modify points in place.
850
- thisQuad = outsideTextQuadrants [ yHalf ] [ xHalf ] ;
856
+ thisQuad = quadrants [ yHalf ] [ xHalf ] ;
851
857
thisQuad . sort ( equatorFirst ) ;
852
858
853
- oppositeQuad = outsideTextQuadrants [ 1 - yHalf ] [ xHalf ] ;
859
+ oppositeQuad = quadrants [ 1 - yHalf ] [ xHalf ] ;
854
860
wholeSide = oppositeQuad . concat ( thisQuad ) ;
855
861
856
- // each needs to avoid the previous
862
+ thisQuadOutside = [ ] ;
857
863
for ( i = 0 ; i < thisQuad . length ; i ++ ) {
858
- var prevPt = i && thisQuad [ i - 1 ] ;
864
+ if ( thisQuad [ i ] . yLabelMid !== undefined ) thisQuadOutside . push ( thisQuad [ i ] ) ;
865
+ }
866
+
867
+ firstOppositeOutsidePt = false ;
868
+ for ( i = 0 ; yHalf && i < oppositeQuad . length ; i ++ ) {
869
+ if ( oppositeQuad [ i ] . yLabelMid !== undefined ) {
870
+ firstOppositeOutsidePt = oppositeQuad [ i ] ;
871
+ break ;
872
+ }
873
+ }
874
+
875
+ // each needs to avoid the previous
876
+ for ( i = 0 ; i < thisQuadOutside . length ; i ++ ) {
877
+ var prevPt = i && thisQuadOutside [ i - 1 ] ;
859
878
// bottom half needs to avoid the first label of the top half
860
879
// top half we still need to call scootOneLabel on the first slice
861
880
// so we can avoid other slices, but we don't pass a prevPt
862
- if ( yHalf && ! i ) prevPt = oppositeQuad [ 0 ] ;
863
- scootOneLabel ( thisQuad [ i ] , prevPt ) ;
881
+ if ( firstOppositeOutsidePt && ! i ) prevPt = firstOppositeOutsidePt ;
882
+ scootOneLabel ( thisQuadOutside [ i ] , prevPt ) ;
864
883
}
865
884
}
866
885
}
0 commit comments