@@ -586,23 +586,60 @@ function computeLegendDimensions(gd, groups, traces) {
586
586
extraWidth = 40 ;
587
587
}
588
588
else if ( isGrouped ) {
589
- var groupXOffsets = [ opts . _width ] ;
589
+ var maxHeight = 0 ;
590
+ var maxWidth = 0 ;
590
591
var groupData = groups . data ( ) ;
591
592
592
- for ( var i = 0 , n = groupData . length ; i < n ; i ++ ) {
593
- var textWidths = groupData [ i ] . map ( function ( legendItemArray ) {
593
+ var maxItems = 0 ;
594
+
595
+ groupData . forEach ( function ( group ) {
596
+
597
+
598
+ var groupWidths = group . map ( function ( legendItemArray ) {
594
599
return legendItemArray [ 0 ] . width ;
595
600
} ) ;
596
601
597
- var groupWidth = 40 + Math . max . apply ( null , textWidths ) ;
602
+ var groupWidth = Math . max . apply ( null , groupWidths ) ;
603
+ var groupHeight = group . reduce ( function ( a , b ) {
604
+ return a + b [ 0 ] . height ;
605
+ } , 0 ) ;
606
+
607
+ maxWidth = Math . max ( maxWidth , groupWidth ) ;
608
+ maxHeight = Math . max ( maxHeight , groupHeight ) ;
609
+ maxItems = Math . max ( maxItems , group . length ) ;
610
+ } ) ;
611
+
612
+ var traceGroupGap = opts . tracegroupgap || 5 ;
613
+
614
+ maxHeight += traceGroupGap ;
615
+
616
+ var groupXOffsets = [ opts . _width ] ;
617
+ var rowHeights = [ ] ;
618
+ var rowNum = 1 ;
619
+ for ( var i = 0 , n = groupData . length ; i < n ; i ++ ) {
620
+ opts . _width += traceGroupGap + maxWidth ;
621
+
622
+ if ( fullLayout . _size . w < ( borderwidth + opts . _width ) ) {
623
+ groupXOffsets [ groupXOffsets . length - 1 ] = 0 ;
624
+ opts . _width = maxWidth + traceGroupGap ;
625
+ rowNum ++ ;
626
+ }
627
+
628
+ var currRowHeight = ( ( rowNum - 1 ) * maxHeight ) ;
598
629
599
- opts . _width += opts . tracegroupgap + groupWidth ;
630
+ var length = groupData [ i ] . length ;
631
+ var y = ( ( 1 - ( length / maxItems ) ) * maxHeight ) ;
632
+ currRowHeight = currRowHeight > ( rowNum - 1 * maxHeight ) ? ( rowNum - 1 ) * maxHeight : y ;
633
+
634
+ rowHeights . push ( currRowHeight ) ;
635
+
636
+ opts . _width += traceGroupGap + maxWidth ;
600
637
601
638
groupXOffsets . push ( opts . _width ) ;
602
639
}
603
640
604
641
groups . each ( function ( d , i ) {
605
- Drawing . setTranslate ( this , groupXOffsets [ i ] , 0 ) ;
642
+ Drawing . setTranslate ( this , groupXOffsets [ i ] , rowHeights [ i ] ) ;
606
643
} ) ;
607
644
608
645
groups . each ( function ( ) {
@@ -620,11 +657,12 @@ function computeLegendDimensions(gd, groups, traces) {
620
657
621
658
groupHeight += textHeight ;
622
659
} ) ;
623
-
624
- opts . _height = Math . max ( opts . _height , groupHeight ) ;
625
660
} ) ;
626
661
627
- opts . _height += 10 + borderwidth * 2 ;
662
+ opts . _height += rowNum * maxHeight ;
663
+
664
+ var totalRows = Math . ceil ( groupData . length / rowNum ) ;
665
+ opts . _width = ( totalRows * ( 40 + maxWidth + traceGroupGap ) ) + 40 ;
628
666
opts . _width += borderwidth * 2 ;
629
667
}
630
668
else {
0 commit comments