Skip to content

Commit dd7eb69

Browse files
authored
Merge pull request #4011 from plotly/parcoords-bug-fix-undefined-ranges
parcoords - bug fix handling undefined ranges and dticks for tickText
2 parents 7e789b3 + bf02101 commit dd7eb69

File tree

3 files changed

+46
-31
lines changed

3 files changed

+46
-31
lines changed

src/traces/parcoords/parcoords.js

+46-31
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) {
@@ -381,45 +380,61 @@ function updatePanelLayout(yAxis, vm) {
381380
function calcAllTicks(cd) {
382381
for(var i = 0; i < cd.length; i++) {
383382
for(var j = 0; j < cd[i].length; j++) {
384-
var dimensions = cd[i][j].trace.dimensions;
383+
var trace = cd[i][j].trace;
384+
var len = trace._length;
385+
var dimensions = trace.dimensions;
386+
385387
for(var k = 0; k < dimensions.length; k++) {
388+
var values = dimensions[k].values;
386389
var dim = dimensions[k]._ax;
387390

388391
if(dim) {
389-
if(!dim.range) dim.range = [0, 1];
390-
if(!dim.dtick) dim.dtick = 0.1;
391-
dim.tickformat = dimensions[k].tickformat;
392+
if(!dim.range) {
393+
var max = -Infinity;
394+
var min = Infinity;
395+
for(var q = 0; q < len; q++) {
396+
var v = values[q];
397+
if(isFinite(v)) {
398+
if(max < v) max = v;
399+
if(min > v) min = v;
400+
}
401+
}
402+
dim.range = [min, max];
403+
}
392404

393-
Axes.calcTicks(dim);
405+
if(!dim.dtick) dim.dtick = 0.01 * Math.abs(dim.range[1] - dim.range[0]);
394406

407+
dim.tickformat = dimensions[k].tickformat;
408+
Axes.calcTicks(dim);
395409
dim.cleanRange();
396410
}
397411
}
398412
}
399413
}
400414
}
401415

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

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

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

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]);
417428

418-
return linearFormat(d.model.dimensions[d.visibleIndex], v);
419-
}
429+
module.exports = function parcoords(gd, cdModule, layout, callbacks) {
430+
var fullLayout = gd._fullLayout;
431+
var svg = fullLayout._toppaper;
432+
var glContainer = fullLayout._glcontainer;
420433

421434
calcAllTicks(cdModule);
422435

436+
var state = parcoordsInteractionState();
437+
423438
var vm = cdModule
424439
.filter(function(d) { return unwrap(d).trace.visible; })
425440
.map(model.bind(0, layout))
@@ -509,14 +524,14 @@ module.exports = function parcoords(gd, cdModule, layout, callbacks) {
509524
});
510525

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

514529
yAxis.enter()
515530
.append('g')
516531
.classed(c.cn.yAxis, true);
517532

518-
parcoordsControlView.each(function(vm) {
519-
updatePanelLayout(yAxis, vm);
533+
parcoordsControlView.each(function(p) {
534+
updatePanelLayout(yAxis, p);
520535
});
521536

522537
glLayers
-3.98 KB
Loading
-5.87 KB
Loading

0 commit comments

Comments
 (0)