@@ -586,23 +586,60 @@ function computeLegendDimensions(gd, groups, traces) {
586586 extraWidth = 40 ;
587587 }
588588 else if ( isGrouped ) {
589- var groupXOffsets = [ opts . _width ] ;
589+ var maxHeight = 0 ;
590+ var maxWidth = 0 ;
590591 var groupData = groups . data ( ) ;
591592
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 ) {
594599 return legendItemArray [ 0 ] . width ;
595600 } ) ;
596601
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 ) ;
598629
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 ;
600637
601638 groupXOffsets . push ( opts . _width ) ;
602639 }
603640
604641 groups . each ( function ( d , i ) {
605- Drawing . setTranslate ( this , groupXOffsets [ i ] , 0 ) ;
642+ Drawing . setTranslate ( this , groupXOffsets [ i ] , rowHeights [ i ] ) ;
606643 } ) ;
607644
608645 groups . each ( function ( ) {
@@ -620,11 +657,12 @@ function computeLegendDimensions(gd, groups, traces) {
620657
621658 groupHeight += textHeight ;
622659 } ) ;
623-
624- opts . _height = Math . max ( opts . _height , groupHeight ) ;
625660 } ) ;
626661
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 ;
628666 opts . _width += borderwidth * 2 ;
629667 }
630668 else {
0 commit comments