@@ -15,12 +15,12 @@ var binFunctions = require('../histogram/bin_functions');
1515var normFunctions = require ( '../histogram/norm_functions' ) ;
1616var doAvg = require ( '../histogram/average' ) ;
1717var getBinSpanLabelRound = require ( '../histogram/bin_label_vals' ) ;
18+ var calcAllAutoBins = require ( '../histogram/calc' ) . calcAllAutoBins ;
1819
1920module . exports = function calc ( gd , trace ) {
20- var xa = Axes . getFromId ( gd , trace . xaxis || 'x' ) ;
21- var x = trace . x ? xa . makeCalcdata ( trace , 'x' ) : [ ] ;
22- var ya = Axes . getFromId ( gd , trace . yaxis || 'y' ) ;
23- var y = trace . y ? ya . makeCalcdata ( trace , 'y' ) : [ ] ;
21+ var xa = Axes . getFromId ( gd , trace . xaxis ) ;
22+ var ya = Axes . getFromId ( gd , trace . yaxis ) ;
23+
2424 var xcalendar = trace . xcalendar ;
2525 var ycalendar = trace . ycalendar ;
2626 var xr2c = function ( v ) { return xa . r2c ( v , 0 , xcalendar ) ; } ;
@@ -30,24 +30,28 @@ module.exports = function calc(gd, trace) {
3030
3131 var i , j , n , m ;
3232
33- var serieslen = trace . _length ;
34- if ( x . length > serieslen ) x . splice ( serieslen , x . length - serieslen ) ;
35- if ( y . length > serieslen ) y . splice ( serieslen , y . length - serieslen ) ;
36-
3733 // calculate the bins
38- doAutoBin ( trace , 'x' , x , xa , xr2c , xc2r , xcalendar ) ;
39- doAutoBin ( trace , 'y' , y , ya , yr2c , yc2r , ycalendar ) ;
34+ var xBinsAndPos = calcAllAutoBins ( gd , trace , xa , 'x' ) ;
35+ var xBinSpec = xBinsAndPos [ 0 ] ;
36+ var xPos0 = xBinsAndPos [ 1 ] ;
37+ var yBinsAndPos = calcAllAutoBins ( gd , trace , ya , 'y' ) ;
38+ var yBinSpec = yBinsAndPos [ 0 ] ;
39+ var yPos0 = yBinsAndPos [ 1 ] ;
40+
41+ var serieslen = trace . _length ;
42+ if ( xPos0 . length > serieslen ) xPos0 . splice ( serieslen , xPos0 . length - serieslen ) ;
43+ if ( yPos0 . length > serieslen ) yPos0 . splice ( serieslen , yPos0 . length - serieslen ) ;
4044
4145 // make the empty bin array & scale the map
4246 var z = [ ] ;
4347 var onecol = [ ] ;
4448 var zerocol = [ ] ;
45- var nonuniformBinsX = typeof trace . xbins . size === 'string' ;
46- var nonuniformBinsY = typeof trace . ybins . size === 'string' ;
49+ var nonuniformBinsX = typeof xBinSpec . size === 'string' ;
50+ var nonuniformBinsY = typeof yBinSpec . size === 'string' ;
4751 var xEdges = [ ] ;
4852 var yEdges = [ ] ;
49- var xbins = nonuniformBinsX ? xEdges : trace . xbins ;
50- var ybins = nonuniformBinsY ? yEdges : trace . ybins ;
53+ var xbins = nonuniformBinsX ? xEdges : xBinSpec ;
54+ var ybins = nonuniformBinsY ? yEdges : yBinSpec ;
5155 var total = 0 ;
5256 var counts = [ ] ;
5357 var inputPoints = [ ] ;
@@ -77,29 +81,28 @@ module.exports = function calc(gd, trace) {
7781 }
7882
7983 // decrease end a little in case of rounding errors
80- var binSpec = trace . xbins ;
81- var binStart = xr2c ( binSpec . start ) ;
82- var binEnd = xr2c ( binSpec . end ) +
83- ( binStart - Axes . tickIncrement ( binStart , binSpec . size , false , xcalendar ) ) / 1e6 ;
84+ var xBinSize = xBinSpec . size ;
85+ var xBinStart = xr2c ( xBinSpec . start ) ;
86+ var xBinEnd = xr2c ( xBinSpec . end ) +
87+ ( xBinStart - Axes . tickIncrement ( xBinStart , xBinSize , false , xcalendar ) ) / 1e6 ;
8488
85- for ( i = binStart ; i < binEnd ; i = Axes . tickIncrement ( i , binSpec . size , false , xcalendar ) ) {
89+ for ( i = xBinStart ; i < xBinEnd ; i = Axes . tickIncrement ( i , xBinSize , false , xcalendar ) ) {
8690 onecol . push ( sizeinit ) ;
8791 xEdges . push ( i ) ;
8892 if ( doavg ) zerocol . push ( 0 ) ;
8993 }
9094 xEdges . push ( i ) ;
9195
9296 var nx = onecol . length ;
93- var x0c = xr2c ( trace . xbins . start ) ;
94- var dx = ( i - x0c ) / nx ;
95- var x0 = xc2r ( x0c + dx / 2 ) ;
97+ var dx = ( i - xBinStart ) / nx ;
98+ var x0 = xc2r ( xBinStart + dx / 2 ) ;
9699
97- binSpec = trace . ybins ;
98- binStart = yr2c ( binSpec . start ) ;
99- binEnd = yr2c ( binSpec . end ) +
100- ( binStart - Axes . tickIncrement ( binStart , binSpec . size , false , ycalendar ) ) / 1e6 ;
100+ var yBinSize = yBinSpec . size ;
101+ var yBinStart = yr2c ( yBinSpec . start ) ;
102+ var yBinEnd = yr2c ( yBinSpec . end ) +
103+ ( yBinStart - Axes . tickIncrement ( yBinStart , yBinSize , false , ycalendar ) ) / 1e6 ;
101104
102- for ( i = binStart ; i < binEnd ; i = Axes . tickIncrement ( i , binSpec . size , false , ycalendar ) ) {
105+ for ( i = yBinStart ; i < yBinEnd ; i = Axes . tickIncrement ( i , yBinSize , false , ycalendar ) ) {
103106 z . push ( onecol . slice ( ) ) ;
104107 yEdges . push ( i ) ;
105108 var ipCol = new Array ( nx ) ;
@@ -110,9 +113,8 @@ module.exports = function calc(gd, trace) {
110113 yEdges . push ( i ) ;
111114
112115 var ny = z . length ;
113- var y0c = yr2c ( trace . ybins . start ) ;
114- var dy = ( i - y0c ) / ny ;
115- var y0 = yc2r ( y0c + dy / 2 ) ;
116+ var dy = ( i - yBinStart ) / ny ;
117+ var y0 = yc2r ( yBinStart + dy / 2 ) ;
116118
117119 if ( densitynorm ) {
118120 xinc = makeIncrements ( onecol . length , xbins , dx , nonuniformBinsX ) ;
@@ -134,8 +136,8 @@ module.exports = function calc(gd, trace) {
134136 var yGapLow = Infinity ;
135137 var yGapHigh = Infinity ;
136138 for ( i = 0 ; i < serieslen ; i ++ ) {
137- var xi = x [ i ] ;
138- var yi = y [ i ] ;
139+ var xi = xPos0 [ i ] ;
140+ var yi = yPos0 [ i ] ;
139141 n = Lib . findBin ( xi , xbins ) ;
140142 m = Lib . findBin ( yi , ybins ) ;
141143 if ( n >= 0 && n < nx && m >= 0 && m < ny ) {
@@ -166,11 +168,11 @@ module.exports = function calc(gd, trace) {
166168 }
167169
168170 return {
169- x : x ,
171+ x : xPos0 ,
170172 xRanges : getRanges ( xEdges , uniqueValsPerX && xVals , xGapLow , xGapHigh , xa , xcalendar ) ,
171173 x0 : x0 ,
172174 dx : dx ,
173- y : y ,
175+ y : yPos0 ,
174176 yRanges : getRanges ( yEdges , uniqueValsPerY && yVals , yGapLow , yGapHigh , ya , ycalendar ) ,
175177 y0 : y0 ,
176178 dy : dy ,
@@ -179,52 +181,6 @@ module.exports = function calc(gd, trace) {
179181 } ;
180182} ;
181183
182- function doAutoBin ( trace , axLetter , data , ax , r2c , c2r , calendar ) {
183- var binAttr = axLetter + 'bins' ;
184- var binSpec = trace [ binAttr ] ;
185- if ( ! binSpec ) binSpec = trace [ binAttr ] = { } ;
186- var inputBinSpec = trace . _input [ binAttr ] || { } ;
187- var autoBin = trace . _autoBin = { } ;
188-
189- // clear out any previously added autobin info
190- if ( ! inputBinSpec . size ) delete binSpec . size ;
191- if ( inputBinSpec . start === undefined ) delete binSpec . start ;
192- if ( inputBinSpec . end === undefined ) delete binSpec . end ;
193-
194- var autoSize = ! binSpec . size ;
195- var autoStart = binSpec . start === undefined ;
196- var autoEnd = binSpec . end === undefined ;
197-
198- if ( autoSize || autoStart || autoEnd ) {
199- var newBinSpec = Axes . autoBin ( data , ax , trace [ 'nbins' + axLetter ] , '2d' , calendar , binSpec . size ) ;
200- if ( trace . type === 'histogram2dcontour' ) {
201- // the "true" 2nd argument reverses the tick direction (which we can't
202- // just do with a minus sign because of month bins)
203- if ( autoStart ) {
204- newBinSpec . start = c2r ( Axes . tickIncrement (
205- r2c ( newBinSpec . start ) , newBinSpec . size , true , calendar ) ) ;
206- }
207- if ( autoEnd ) {
208- newBinSpec . end = c2r ( Axes . tickIncrement (
209- r2c ( newBinSpec . end ) , newBinSpec . size , false , calendar ) ) ;
210- }
211- }
212- if ( autoSize ) binSpec . size = autoBin . size = newBinSpec . size ;
213- if ( autoStart ) binSpec . start = autoBin . start = newBinSpec . start ;
214- if ( autoEnd ) binSpec . end = autoBin . end = newBinSpec . end ;
215- }
216-
217- // Backward compatibility for one-time autobinning.
218- // autobin: true is handled in cleanData, but autobin: false
219- // needs to be here where we have determined the values.
220- var autoBinAttr = 'autobin' + axLetter ;
221- if ( trace . _input [ autoBinAttr ] === false ) {
222- trace . _input [ binAttr ] = Lib . extendFlat ( { } , binSpec ) ;
223- delete trace . _input [ autoBinAttr ] ;
224- delete trace [ autoBinAttr ] ;
225- }
226- }
227-
228184function makeIncrements ( len , bins , dv , nonuniform ) {
229185 var out = new Array ( len ) ;
230186 var i ;
0 commit comments