@@ -2822,59 +2822,85 @@ plots.doCalcdata = function(gd, traces) {
2822
2822
doCrossTraceCalc ( gd ) ;
2823
2823
2824
2824
// Sort axis categories per value if specified
2825
- if ( sortAxisCategoriesByValue ( axList , gd ) ) {
2825
+ var sorted = sortAxisCategoriesByValue ( axList , gd ) ;
2826
+ if ( sorted . length ) {
2826
2827
// If a sort operation was performed, run calc() again
2827
- for ( i = 0 ; i < fullData . length ; i ++ ) calci ( i , true ) ;
2828
- for ( i = 0 ; i < fullData . length ; i ++ ) calci ( i , false ) ;
2828
+ for ( i = 0 ; i < sorted . length ; i ++ ) calci ( sorted [ i ] , true ) ;
2829
+ for ( i = 0 ; i < sorted . length ; i ++ ) calci ( sorted [ i ] , false ) ;
2829
2830
doCrossTraceCalc ( gd ) ;
2830
2831
}
2831
2832
2832
2833
Registry . getComponentMethod ( 'fx' , 'calc' ) ( gd ) ;
2833
2834
Registry . getComponentMethod ( 'errorbars' , 'calc' ) ( gd ) ;
2834
2835
} ;
2835
2836
2837
+ var sortAxisCategoriesByValueRegex = / ( v a l u e | s u m | m i n | m a x ) ( a s c e n d i n g | d e s c e n d i n g ) / ;
2838
+
2836
2839
function sortAxisCategoriesByValue ( axList , gd ) {
2837
- var sortByValue = false ;
2840
+ var sortByValue = [ ] ;
2838
2841
var i , j , k ;
2839
2842
for ( i = 0 ; i < axList . length ; i ++ ) {
2840
2843
var ax = axList [ i ] ;
2841
2844
if ( ax . type !== 'category' ) continue ;
2842
2845
2843
2846
// Order by value
2844
- if ( ax . categoryorder === 'value ascending' ||
2845
- ax . categoryorder === 'value descending' ) {
2846
- sortByValue = true ;
2847
-
2848
- // Store value associated with each category
2847
+ var m = ax . categoryorder . match ( sortAxisCategoriesByValueRegex ) ;
2848
+ if ( m ) {
2849
+ // Store values associated with each category
2849
2850
var categoriesValue = [ ] ;
2850
2851
for ( j = 0 ; j < ax . _categories . length ; j ++ ) {
2851
- categoriesValue . push ( [ ax . _categories [ j ] , 0 ] ) ;
2852
+ categoriesValue . push ( [ ax . _categories [ j ] , [ ] ] ) ;
2852
2853
}
2853
2854
2854
- // Aggregate values across traces
2855
+ // Collect values across traces
2855
2856
for ( j = 0 ; j < ax . _traceIndices . length ; j ++ ) {
2857
+ // Keep track of traces we sort!
2856
2858
var traceIndex = ax . _traceIndices [ j ] ;
2859
+ sortByValue . push ( traceIndex ) ;
2860
+
2857
2861
var fullData = gd . _fullData [ traceIndex ] ;
2858
2862
if ( fullData . visible !== true ) continue ;
2859
- var cd = gd . calcdata [ traceIndex ] ;
2860
- var type = fullData . type ;
2861
2863
2864
+ var type = fullData . type ;
2862
2865
if ( type === 'histogram' ) delete fullData . _autoBinFinished ;
2863
2866
2867
+ var cd = gd . calcdata [ traceIndex ] ;
2864
2868
for ( k = 0 ; k < cd . length ; k ++ ) {
2869
+ var cat , value ;
2865
2870
if ( type === 'scatter' ) {
2866
2871
if ( ax . _id [ 0 ] === 'x' ) {
2867
- categoriesValue [ cd [ k ] . x ] [ 1 ] += cd [ k ] . y ;
2872
+ cat = cd [ k ] . x ;
2873
+ value = cd [ k ] . y ;
2868
2874
} else if ( ax . _id [ 0 ] === 'y' ) {
2869
- categoriesValue [ cd [ k ] . y ] [ 1 ] += cd [ k ] . x ;
2875
+ cat = cd [ k ] . y ;
2876
+ value = cd [ k ] . x ;
2870
2877
}
2871
2878
} else if ( type === 'histogram' ) {
2872
- categoriesValue [ cd [ k ] . p ] [ 1 ] += cd [ k ] . s ;
2879
+ cat = cd [ k ] . p ;
2880
+ value = cd [ k ] . s ;
2873
2881
}
2882
+ categoriesValue [ cat ] [ 1 ] . push ( value ) ;
2874
2883
}
2875
2884
}
2876
2885
2877
- // Sort by value
2886
+ // Aggregate values
2887
+ var aggFn ;
2888
+ switch ( m [ 1 ] ) {
2889
+ case 'min' :
2890
+ aggFn = Math . min ;
2891
+ break ;
2892
+ case 'max' :
2893
+ aggFn = Math . max ;
2894
+ break ;
2895
+ default :
2896
+ aggFn = function ( a , b ) { return a + b ; } ;
2897
+ }
2898
+
2899
+ for ( j = 0 ; j < categoriesValue . length ; j ++ ) {
2900
+ categoriesValue [ j ] [ 1 ] = Lib . aggNums ( aggFn , null , categoriesValue [ j ] [ 1 ] ) ;
2901
+ }
2902
+
2903
+ // Sort by aggregated value
2878
2904
categoriesValue . sort ( function ( a , b ) {
2879
2905
return a [ 1 ] - b [ 1 ] ;
2880
2906
} ) ;
@@ -2885,7 +2911,7 @@ function sortAxisCategoriesByValue(axList, gd) {
2885
2911
} ) ;
2886
2912
2887
2913
// Reverse if descending
2888
- if ( ax . categoryorder === 'value descending' ) {
2914
+ if ( m [ 2 ] === 'descending' ) {
2889
2915
ax . _initialCategories . reverse ( ) ;
2890
2916
}
2891
2917
0 commit comments