Skip to content

Commit f373a88

Browse files
committed
parcoords - bug fix undefined ranges and ticks
1 parent 7e789b3 commit f373a88

File tree

4 files changed

+40
-28
lines changed

4 files changed

+40
-28
lines changed

src/traces/parcoords/defaults.js

+13
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ function dimensionDefaults(dimensionIn, dimensionOut, parentOut, opts) {
5555
coerce('ticktext');
5656
coerce('tickformat');
5757
var range = coerce('range');
58+
if(!range) {
59+
var max = -Infinity;
60+
var min = Infinity;
61+
for(var i = 0; i < values.length; i++) {
62+
var v = values[i];
63+
if(isFinite(v)) {
64+
if(max < v) max = v;
65+
if(min > v) min = v;
66+
}
67+
}
68+
69+
range = [min, max];
70+
}
5871

5972
dimensionOut._ax = {
6073
_id: 'y',

src/traces/parcoords/parcoords.js

+27-28
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ function viewModel(state, callbacks, model) {
206206
var unitPad = c.verticalPadding / height;
207207
var _unitToPaddedPx = unitToPaddedPx(height, c.verticalPadding);
208208

209-
var viewModel = {
209+
var vm = {
210210
key: model.key,
211211
xScale: xScale,
212212
model: model,
@@ -215,7 +215,7 @@ function viewModel(state, callbacks, model) {
215215

216216
var uniqueKeys = {};
217217

218-
viewModel.dimensions = dimensions.filter(helpers.isVisible).map(function(dimension, i) {
218+
vm.dimensions = dimensions.filter(helpers.isVisible).map(function(dimension, i) {
219219
var domainToPaddedUnit = domainToPaddedUnitScale(dimension, unitPad);
220220
var foundKey = uniqueKeys[dimension.label];
221221
uniqueKeys[dimension.label] = (foundKey || 0) + 1;
@@ -229,7 +229,7 @@ function viewModel(state, callbacks, model) {
229229
specifiedConstraint.map(function(d) { return d.map(domainToPaddedUnit); }) :
230230
[[-Infinity, Infinity]];
231231
var brushMove = function() {
232-
var p = viewModel;
232+
var p = vm;
233233
p.focusLayer && p.focusLayer.render(p.panels, true);
234234
var filtersActive = someFiltersActive(p);
235235
if(!state.contextShown() && filtersActive) {
@@ -299,7 +299,7 @@ function viewModel(state, callbacks, model) {
299299
unitToPaddedPx: _unitToPaddedPx,
300300
domainScale: domainScale(height, c.verticalPadding, dimension, tickvals, ticktext),
301301
ordinalScale: ordinalScale(dimension),
302-
parent: viewModel,
302+
parent: vm,
303303
model: model,
304304
brush: brush.makeBrush(
305305
state,
@@ -310,9 +310,8 @@ function viewModel(state, callbacks, model) {
310310
},
311311
brushMove,
312312
function(f) {
313-
var p = viewModel;
314-
p.focusLayer.render(p.panels, true);
315-
p.pickLayer && p.pickLayer.render(p.panels, true);
313+
vm.focusLayer.render(vm.panels, true);
314+
vm.pickLayer && vm.pickLayer.render(vm.panels, true);
316315
state.linePickActive(true);
317316
if(callbacks && callbacks.filterChanged) {
318317
var invScale = domainToPaddedUnit.invert;
@@ -321,14 +320,14 @@ function viewModel(state, callbacks, model) {
321320
var newRanges = f.map(function(r) {
322321
return r.map(invScale).sort(Lib.sorterAsc);
323322
}).sort(function(a, b) { return a[0] - b[0]; });
324-
callbacks.filterChanged(p.key, dimension._index, newRanges);
323+
callbacks.filterChanged(vm.key, dimension._index, newRanges);
325324
}
326325
}
327326
)
328327
};
329328
});
330329

331-
return viewModel;
330+
return vm;
332331
}
333332

334333
function styleExtentTexts(selection) {
@@ -386,8 +385,7 @@ function calcAllTicks(cd) {
386385
var dim = dimensions[k]._ax;
387386

388387
if(dim) {
389-
if(!dim.range) dim.range = [0, 1];
390-
if(!dim.dtick) dim.dtick = 0.1;
388+
if(!dim.dtick) dim.dtick = 0.01 * Math.abs(dim.range[1] - dim.range[0]);
391389
dim.tickformat = dimensions[k].tickformat;
392390

393391
Axes.calcTicks(dim);
@@ -399,27 +397,28 @@ function calcAllTicks(cd) {
399397
}
400398
}
401399

402-
module.exports = function parcoords(gd, cdModule, layout, callbacks) {
403-
var state = parcoordsInteractionState();
400+
function linearFormat(dim, v) {
401+
return Axes.tickText(dim._ax, v, false).text;
402+
}
404403

405-
var fullLayout = gd._fullLayout;
406-
var svg = fullLayout._toppaper;
407-
var glContainer = fullLayout._glcontainer;
404+
function extremeText(d, isTop) {
405+
if(d.ordinal) return '';
406+
var domain = d.domainScale.domain();
407+
var v = (domain[isTop ? domain.length - 1 : 0]);
408408

409-
function linearFormat(dim, v) {
410-
return Axes.tickText(dim._ax, v, false).text;
411-
}
409+
return linearFormat(d.model.dimensions[d.visibleIndex], v);
410+
}
412411

413-
function extremeText(d, isTop) {
414-
if(d.ordinal) return '';
415-
var domain = d.domainScale.domain();
416-
var v = (domain[isTop ? domain.length - 1 : 0]);
417412

418-
return linearFormat(d.model.dimensions[d.visibleIndex], v);
419-
}
413+
module.exports = function parcoords(gd, cdModule, layout, callbacks) {
414+
var fullLayout = gd._fullLayout;
415+
var svg = fullLayout._toppaper;
416+
var glContainer = fullLayout._glcontainer;
420417

421418
calcAllTicks(cdModule);
422419

420+
var state = parcoordsInteractionState();
421+
423422
var vm = cdModule
424423
.filter(function(d) { return unwrap(d).trace.visible; })
425424
.map(model.bind(0, layout))
@@ -509,14 +508,14 @@ module.exports = function parcoords(gd, cdModule, layout, callbacks) {
509508
});
510509

511510
var yAxis = parcoordsControlView.selectAll('.' + c.cn.yAxis)
512-
.data(function(vm) { return vm.dimensions; }, keyFun);
511+
.data(function(p) { return p.dimensions; }, keyFun);
513512

514513
yAxis.enter()
515514
.append('g')
516515
.classed(c.cn.yAxis, true);
517516

518-
parcoordsControlView.each(function(vm) {
519-
updatePanelLayout(yAxis, vm);
517+
parcoordsControlView.each(function(p) {
518+
updatePanelLayout(yAxis, p);
520519
});
521520

522521
glLayers
-3.98 KB
Loading
-5.87 KB
Loading

0 commit comments

Comments
 (0)