@@ -556,6 +556,8 @@ function computeLegendDimensions(gd, groups, traces) {
556
556
557
557
var extraWidth = 0 ;
558
558
559
+ var traceGap = 5 ;
560
+
559
561
opts . _width = 0 ;
560
562
opts . _height = 0 ;
561
563
@@ -589,23 +591,53 @@ function computeLegendDimensions(gd, groups, traces) {
589
591
extraWidth = 40 ;
590
592
}
591
593
else if ( isGrouped ) {
592
- var groupXOffsets = [ opts . _width ] ;
594
+ var maxHeight = 0 ;
595
+ var maxWidth = 0 ;
593
596
var groupData = groups . data ( ) ;
594
597
595
- for ( var i = 0 , n = groupData . length ; i < n ; i ++ ) {
596
- var textWidths = groupData [ i ] . map ( function ( legendItemArray ) {
598
+ var maxItems = 0 ;
599
+
600
+ var i ;
601
+ for ( i = 0 ; i < groupData . length ; i ++ ) {
602
+ var group = groupData [ i ] ;
603
+ var groupWidths = group . map ( function ( legendItemArray ) {
597
604
return legendItemArray [ 0 ] . width ;
598
605
} ) ;
599
606
600
- var groupWidth = 40 + Math . max . apply ( null , textWidths ) ;
607
+ var groupWidth = Lib . aggNums ( Math . max , null , groupWidths ) ;
608
+ var groupHeight = group . reduce ( function ( a , b ) {
609
+ return a + b [ 0 ] . height ;
610
+ } , 0 ) ;
601
611
602
- opts . _width += opts . tracegroupgap + groupWidth ;
612
+ maxWidth = Math . max ( maxWidth , groupWidth ) ;
613
+ maxHeight = Math . max ( maxHeight , groupHeight ) ;
614
+ maxItems = Math . max ( maxItems , group . length ) ;
615
+ }
603
616
617
+ maxWidth += traceGap ;
618
+ maxWidth += 40 ;
619
+
620
+ var groupXOffsets = [ opts . _width ] ;
621
+ var groupYOffsets = [ ] ;
622
+ var rowNum = 0 ;
623
+ for ( i = 0 ; i < groupData . length ; i ++ ) {
624
+ if ( fullLayout . _size . w < ( borderwidth + opts . _width + traceGap + maxWidth ) ) {
625
+ groupXOffsets [ groupXOffsets . length - 1 ] = groupXOffsets [ 0 ] ;
626
+ opts . _width = maxWidth ;
627
+ rowNum ++ ;
628
+ } else {
629
+ opts . _width += maxWidth + borderwidth ;
630
+ }
631
+
632
+ var rowYOffset = ( rowNum * maxHeight ) ;
633
+ rowYOffset += rowNum > 0 ? opts . tracegroupgap : 0 ;
634
+
635
+ groupYOffsets . push ( rowYOffset ) ;
604
636
groupXOffsets . push ( opts . _width ) ;
605
637
}
606
638
607
639
groups . each ( function ( d , i ) {
608
- Drawing . setTranslate ( this , groupXOffsets [ i ] , 0 ) ;
640
+ Drawing . setTranslate ( this , groupXOffsets [ i ] , groupYOffsets [ i ] ) ;
609
641
} ) ;
610
642
611
643
groups . each ( function ( ) {
@@ -623,11 +655,13 @@ function computeLegendDimensions(gd, groups, traces) {
623
655
624
656
groupHeight += textHeight ;
625
657
} ) ;
626
-
627
- opts . _height = Math . max ( opts . _height , groupHeight ) ;
628
658
} ) ;
629
659
630
- opts . _height += 10 + borderwidth * 2 ;
660
+ var maxYLegend = groupYOffsets [ groupYOffsets . length - 1 ] + maxHeight ;
661
+ opts . _height = 10 + ( borderwidth * 2 ) + maxYLegend ;
662
+
663
+ var maxOffset = Math . max . apply ( null , groupXOffsets ) ;
664
+ opts . _width = maxOffset + maxWidth + 40 ;
631
665
opts . _width += borderwidth * 2 ;
632
666
}
633
667
else {
@@ -636,7 +670,6 @@ function computeLegendDimensions(gd, groups, traces) {
636
670
var maxTraceWidth = 0 ;
637
671
var offsetX = 0 ;
638
672
var fullTracesWidth = 0 ;
639
- var traceGap = opts . tracegroupgap || 5 ;
640
673
641
674
// calculate largest width for traces and use for width of all legend items
642
675
traces . each ( function ( d ) {
0 commit comments