diff --git a/src/traces/parcoords/parcoords.js b/src/traces/parcoords/parcoords.js index b3a59b9eda4..ec6f265c91c 100644 --- a/src/traces/parcoords/parcoords.js +++ b/src/traces/parcoords/parcoords.js @@ -206,7 +206,7 @@ function viewModel(state, callbacks, model) { var unitPad = c.verticalPadding / height; var _unitToPaddedPx = unitToPaddedPx(height, c.verticalPadding); - var viewModel = { + var vm = { key: model.key, xScale: xScale, model: model, @@ -215,7 +215,7 @@ function viewModel(state, callbacks, model) { var uniqueKeys = {}; - viewModel.dimensions = dimensions.filter(helpers.isVisible).map(function(dimension, i) { + vm.dimensions = dimensions.filter(helpers.isVisible).map(function(dimension, i) { var domainToPaddedUnit = domainToPaddedUnitScale(dimension, unitPad); var foundKey = uniqueKeys[dimension.label]; uniqueKeys[dimension.label] = (foundKey || 0) + 1; @@ -229,7 +229,7 @@ function viewModel(state, callbacks, model) { specifiedConstraint.map(function(d) { return d.map(domainToPaddedUnit); }) : [[-Infinity, Infinity]]; var brushMove = function() { - var p = viewModel; + var p = vm; p.focusLayer && p.focusLayer.render(p.panels, true); var filtersActive = someFiltersActive(p); if(!state.contextShown() && filtersActive) { @@ -299,7 +299,7 @@ function viewModel(state, callbacks, model) { unitToPaddedPx: _unitToPaddedPx, domainScale: domainScale(height, c.verticalPadding, dimension, tickvals, ticktext), ordinalScale: ordinalScale(dimension), - parent: viewModel, + parent: vm, model: model, brush: brush.makeBrush( state, @@ -310,9 +310,8 @@ function viewModel(state, callbacks, model) { }, brushMove, function(f) { - var p = viewModel; - p.focusLayer.render(p.panels, true); - p.pickLayer && p.pickLayer.render(p.panels, true); + vm.focusLayer.render(vm.panels, true); + vm.pickLayer && vm.pickLayer.render(vm.panels, true); state.linePickActive(true); if(callbacks && callbacks.filterChanged) { var invScale = domainToPaddedUnit.invert; @@ -321,14 +320,14 @@ function viewModel(state, callbacks, model) { var newRanges = f.map(function(r) { return r.map(invScale).sort(Lib.sorterAsc); }).sort(function(a, b) { return a[0] - b[0]; }); - callbacks.filterChanged(p.key, dimension._index, newRanges); + callbacks.filterChanged(vm.key, dimension._index, newRanges); } } ) }; }); - return viewModel; + return vm; } function styleExtentTexts(selection) { @@ -381,17 +380,32 @@ function updatePanelLayout(yAxis, vm) { function calcAllTicks(cd) { for(var i = 0; i < cd.length; i++) { for(var j = 0; j < cd[i].length; j++) { - var dimensions = cd[i][j].trace.dimensions; + var trace = cd[i][j].trace; + var len = trace._length; + var dimensions = trace.dimensions; + for(var k = 0; k < dimensions.length; k++) { + var values = dimensions[k].values; var dim = dimensions[k]._ax; if(dim) { - if(!dim.range) dim.range = [0, 1]; - if(!dim.dtick) dim.dtick = 0.1; - dim.tickformat = dimensions[k].tickformat; + if(!dim.range) { + var max = -Infinity; + var min = Infinity; + for(var q = 0; q < len; q++) { + var v = values[q]; + if(isFinite(v)) { + if(max < v) max = v; + if(min > v) min = v; + } + } + dim.range = [min, max]; + } - Axes.calcTicks(dim); + if(!dim.dtick) dim.dtick = 0.01 * Math.abs(dim.range[1] - dim.range[0]); + dim.tickformat = dimensions[k].tickformat; + Axes.calcTicks(dim); dim.cleanRange(); } } @@ -399,27 +413,28 @@ function calcAllTicks(cd) { } } -module.exports = function parcoords(gd, cdModule, layout, callbacks) { - var state = parcoordsInteractionState(); +function linearFormat(dim, v) { + return Axes.tickText(dim._ax, v, false).text; +} - var fullLayout = gd._fullLayout; - var svg = fullLayout._toppaper; - var glContainer = fullLayout._glcontainer; +function extremeText(d, isTop) { + if(d.ordinal) return ''; + var domain = d.domainScale.domain(); + var v = (domain[isTop ? domain.length - 1 : 0]); - function linearFormat(dim, v) { - return Axes.tickText(dim._ax, v, false).text; - } + return linearFormat(d.model.dimensions[d.visibleIndex], v); +} - function extremeText(d, isTop) { - if(d.ordinal) return ''; - var domain = d.domainScale.domain(); - var v = (domain[isTop ? domain.length - 1 : 0]); - return linearFormat(d.model.dimensions[d.visibleIndex], v); - } +module.exports = function parcoords(gd, cdModule, layout, callbacks) { + var fullLayout = gd._fullLayout; + var svg = fullLayout._toppaper; + var glContainer = fullLayout._glcontainer; calcAllTicks(cdModule); + var state = parcoordsInteractionState(); + var vm = cdModule .filter(function(d) { return unwrap(d).trace.visible; }) .map(model.bind(0, layout)) @@ -509,14 +524,14 @@ module.exports = function parcoords(gd, cdModule, layout, callbacks) { }); var yAxis = parcoordsControlView.selectAll('.' + c.cn.yAxis) - .data(function(vm) { return vm.dimensions; }, keyFun); + .data(function(p) { return p.dimensions; }, keyFun); yAxis.enter() .append('g') .classed(c.cn.yAxis, true); - parcoordsControlView.each(function(vm) { - updatePanelLayout(yAxis, vm); + parcoordsControlView.each(function(p) { + updatePanelLayout(yAxis, p); }); glLayers diff --git a/test/image/baselines/gl2d_parcoords.png b/test/image/baselines/gl2d_parcoords.png index d73145f6a5e..dd93bb28164 100644 Binary files a/test/image/baselines/gl2d_parcoords.png and b/test/image/baselines/gl2d_parcoords.png differ diff --git a/test/image/baselines/gl2d_parcoords_large.png b/test/image/baselines/gl2d_parcoords_large.png index 10c07432e20..595564414e3 100644 Binary files a/test/image/baselines/gl2d_parcoords_large.png and b/test/image/baselines/gl2d_parcoords_large.png differ