Skip to content

Commit 6093d34

Browse files
committed
use calcAllAutoBins in Histogram2d.calc
1 parent e0d9765 commit 6093d34

File tree

2 files changed

+61
-83
lines changed

2 files changed

+61
-83
lines changed

src/traces/histogram/calc.js

+25-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
var isNumeric = require('fast-isnumeric');
1212

1313
var Lib = require('../../lib');
14+
var Registry = require('../../registry');
1415
var Axes = require('../../plots/cartesian/axes');
1516

1617
var arraysToCalcdata = require('../bar/arrays_to_calcdata');
@@ -242,6 +243,8 @@ function calcAllAutoBins(gd, trace, pa, mainData, _overlayEdgeCase) {
242243
// But this complicates things a bit since those traces don't `calc`,
243244
// hence `isFirstVisible`.
244245
var isFirstVisible = true;
246+
var has2dMap = false;
247+
var hasHist2dContour = false;
245248
for(i = 0; i < traces.length; i++) {
246249
tracei = traces[i];
247250

@@ -259,21 +262,40 @@ function calcAllAutoBins(gd, trace, pa, mainData, _overlayEdgeCase) {
259262
delete tracei._autoBin;
260263
tracei._autoBinFinished = 1;
261264
}
265+
if(Registry.traceIs(tracei, '2dMap')) {
266+
has2dMap = true;
267+
}
268+
if(tracei.type === 'histogram2dcontour') {
269+
hasHist2dContour = true;
270+
}
262271
}
263272
}
264273
}
265274

266275
calendar = traces[0][mainData + 'calendar'];
267-
var newBinSpec = Axes.autoBin(allPos, pa, binOpts.nbins, false, calendar, binOpts.sizeFound && binOpts.size);
276+
var newBinSpec = Axes.autoBin(allPos, pa, binOpts.nbins, has2dMap, calendar, binOpts.sizeFound && binOpts.size);
268277

269278
var autoBin = traces[0]._autoBin = {};
270279
autoVals = autoBin[binOpts.dirs[0]] = {};
271280

281+
if(hasHist2dContour) {
282+
// the "true" 2nd argument reverses the tick direction (which we can't
283+
// just do with a minus sign because of month bins)
284+
if(!binOpts.size) {
285+
newBinSpec.start = c2r(Axes.tickIncrement(
286+
r2c(newBinSpec.start), newBinSpec.size, true, calendar));
287+
}
288+
if(binOpts.end === undefined) {
289+
newBinSpec.end = c2r(Axes.tickIncrement(
290+
r2c(newBinSpec.end), newBinSpec.size, false, calendar));
291+
}
292+
}
293+
272294
// TODO how does work with bingroup ????
273295
//
274296
// Edge case: single-valued histogram overlaying others
275297
// Use them all together to calculate the bin size for the single-valued one
276-
if(isOverlay && newBinSpec._dataSpan === 0 &&
298+
if(isOverlay && !Registry.traceIs(trace, '2dMap') && newBinSpec._dataSpan === 0 &&
277299
pa.type !== 'category' && pa.type !== 'multicategory') {
278300
// Several single-valued histograms! Stop infinite recursion,
279301
// just return an extra flag that tells handleSingleValueOverlays
@@ -284,7 +306,7 @@ function calcAllAutoBins(gd, trace, pa, mainData, _overlayEdgeCase) {
284306
}
285307

286308
// adjust for CDF edge cases
287-
cumulativeSpec = tracei.cumulative;
309+
cumulativeSpec = tracei.cumulative || {};
288310
if(cumulativeSpec.enabled && (cumulativeSpec.currentbin !== 'include')) {
289311
if(cumulativeSpec.direction === 'decreasing') {
290312
newBinSpec.start = c2r(Axes.tickIncrement(

src/traces/histogram2d/calc.js

+36-80
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ var binFunctions = require('../histogram/bin_functions');
1515
var normFunctions = require('../histogram/norm_functions');
1616
var doAvg = require('../histogram/average');
1717
var getBinSpanLabelRound = require('../histogram/bin_label_vals');
18+
var calcAllAutoBins = require('../histogram/calc').calcAllAutoBins;
1819

1920
module.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-
228184
function makeIncrements(len, bins, dv, nonuniform) {
229185
var out = new Array(len);
230186
var i;

0 commit comments

Comments
 (0)