@@ -15,6 +15,7 @@ var Axes = require('../../plots/cartesian/axes');
1515var binFunctions = require ( '../histogram/bin_functions' ) ;
1616var normFunctions = require ( '../histogram/norm_functions' ) ;
1717var doAvg = require ( '../histogram/average' ) ;
18+ var cleanBins = require ( '../histogram/clean_bins' ) ;
1819
1920
2021module . exports = function calc ( gd , trace ) {
@@ -29,6 +30,9 @@ module.exports = function calc(gd, trace) {
2930 z ,
3031 i ;
3132
33+ cleanBins ( trace , xa , 'x' ) ;
34+ cleanBins ( trace , ya , 'y' ) ;
35+
3236 var serieslen = Math . min ( x . length , y . length ) ;
3337 if ( x . length > serieslen ) x . splice ( serieslen , x . length - serieslen ) ;
3438 if ( y . length > serieslen ) y . splice ( serieslen , y . length - serieslen ) ;
@@ -38,8 +42,10 @@ module.exports = function calc(gd, trace) {
3842 if ( trace . autobinx || ! ( 'xbins' in trace ) ) {
3943 trace . xbins = Axes . autoBin ( x , xa , trace . nbinsx , '2d' ) ;
4044 if ( trace . type === 'histogram2dcontour' ) {
41- trace . xbins . start -= trace . xbins . size ;
42- trace . xbins . end += trace . xbins . size ;
45+ // the "true" last argument reverses the tick direction (which we can't
46+ // just do with a minus sign because of month bins)
47+ trace . xbins . start = xa . c2r ( Axes . tickIncrement ( xa . r2c ( trace . xbins . start ) , trace . xbins . size , true ) ) ;
48+ trace . xbins . end = xa . c2r ( Axes . tickIncrement ( xa . r2c ( trace . xbins . end ) , trace . xbins . size ) ) ;
4349 }
4450
4551 // copy bin info back to the source data.
@@ -48,8 +54,8 @@ module.exports = function calc(gd, trace) {
4854 if ( trace . autobiny || ! ( 'ybins' in trace ) ) {
4955 trace . ybins = Axes . autoBin ( y , ya , trace . nbinsy , '2d' ) ;
5056 if ( trace . type === 'histogram2dcontour' ) {
51- trace . ybins . start -= trace . ybins . size ;
52- trace . ybins . end += trace . ybins . size ;
57+ trace . ybins . start = ya . c2r ( Axes . tickIncrement ( ya . r2c ( trace . ybins . start ) , trace . ybins . size , true ) ) ;
58+ trace . ybins . end = ya . c2r ( Axes . tickIncrement ( ya . r2c ( trace . ybins . end ) , trace . ybins . size ) ) ;
5359 }
5460 trace . _input . ybins = trace . ybins ;
5561 }
@@ -91,11 +97,11 @@ module.exports = function calc(gd, trace) {
9197
9298 // decrease end a little in case of rounding errors
9399 var binspec = trace . xbins ,
94- binend = binspec . end +
95- ( binspec . start - Axes . tickIncrement ( binspec . start , binspec . size ) ) / 1e6 ;
100+ binStart = xa . r2c ( binspec . start ) ,
101+ binEnd = xa . r2c ( binspec . end ) +
102+ ( binStart - Axes . tickIncrement ( binStart , binspec . size ) ) / 1e6 ;
96103
97- for ( i = binspec . start ; i < binend ;
98- i = Axes . tickIncrement ( i , binspec . size ) ) {
104+ for ( i = binStart ; i < binEnd ; i = Axes . tickIncrement ( i , binspec . size ) ) {
99105 onecol . push ( sizeinit ) ;
100106 if ( Array . isArray ( xbins ) ) xbins . push ( i ) ;
101107 if ( doavg ) zerocol . push ( 0 ) ;
@@ -104,15 +110,16 @@ module.exports = function calc(gd, trace) {
104110
105111 var nx = onecol . length ;
106112 x0 = trace . xbins . start ;
107- dx = ( i - x0 ) / nx ;
108- x0 += dx / 2 ;
113+ var x0c = xa . r2c ( x0 ) ;
114+ dx = ( i - x0c ) / nx ;
115+ x0 = xa . c2r ( x0c + dx / 2 ) ;
109116
110117 binspec = trace . ybins ;
111- binend = binspec . end +
112- ( binspec . start - Axes . tickIncrement ( binspec . start , binspec . size ) ) / 1e6 ;
118+ binStart = ya . r2c ( binspec . start ) ;
119+ binEnd = ya . r2c ( binspec . end ) +
120+ ( binStart - Axes . tickIncrement ( binStart , binspec . size ) ) / 1e6 ;
113121
114- for ( i = binspec . start ; i < binend ;
115- i = Axes . tickIncrement ( i , binspec . size ) ) {
122+ for ( i = binStart ; i < binEnd ; i = Axes . tickIncrement ( i , binspec . size ) ) {
116123 z . push ( onecol . concat ( ) ) ;
117124 if ( Array . isArray ( ybins ) ) ybins . push ( i ) ;
118125 if ( doavg ) counts . push ( zerocol . concat ( ) ) ;
@@ -121,8 +128,9 @@ module.exports = function calc(gd, trace) {
121128
122129 var ny = z . length ;
123130 y0 = trace . ybins . start ;
124- dy = ( i - y0 ) / ny ;
125- y0 += dy / 2 ;
131+ var y0c = ya . r2c ( y0 ) ;
132+ dy = ( i - y0c ) / ny ;
133+ y0 = ya . c2r ( y0c + dy / 2 ) ;
126134
127135 if ( densitynorm ) {
128136 xinc = onecol . map ( function ( v , i ) {
0 commit comments