From 5bcd09ecd7a9c6f1fc33824080a6bf287869e988 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Mon, 7 May 2018 16:52:34 -0400 Subject: [PATCH 1/3] :hocho: duplicate attribute in sankey render --- src/traces/sankey/render.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/traces/sankey/render.js b/src/traces/sankey/render.js index cdef0ee4408..de2128f99e8 100644 --- a/src/traces/sankey/render.js +++ b/src/traces/sankey/render.js @@ -430,7 +430,6 @@ module.exports = function(svg, styledData, layout, callbacks) { .style('left', 0) .style('shape-rendering', 'geometricPrecision') .style('pointer-events', 'auto') - .style('box-sizing', 'content-box') .attr('transform', sankeyTransform); sankey.transition() From b77737800a3b7e36de77b41757d06ef553e68cca Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 11 May 2018 14:40:53 -0400 Subject: [PATCH 2/3] fix #2480 - accept messier data for Sankey diagrams --- src/lib/index.js | 13 +++ src/plot_api/plot_schema.js | 2 + src/traces/sankey/calc.js | 11 ++- src/traces/sankey/defaults.js | 9 -- src/traces/sankey/render.js | 116 +++++++++++++++++--------- test/image/baselines/sankey_messy.png | Bin 0 -> 82729 bytes test/image/mocks/sankey_messy.json | 43 ++++++++++ test/jasmine/tests/sankey_test.js | 43 +++++----- 8 files changed, 164 insertions(+), 73 deletions(-) create mode 100644 test/image/baselines/sankey_messy.png create mode 100644 test/image/mocks/sankey_messy.json diff --git a/src/lib/index.js b/src/lib/index.js index 9c2b4b03cb1..82233e2eb31 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -134,6 +134,19 @@ lib.ensureNumber = function num(v) { return isNumeric(v) ? Number(v) : BADNUM; }; +/** + * Is v a valid array index? Accepts numeric strings as well as numbers. + * + * @param {any} v: the value to test + * @param {Optional[integer]} len: the array length we are indexing + * + * @return {bool}: v is a valid array index + */ +lib.isIndex = function(v, len) { + if(len !== undefined && v >= len) return false; + return isNumeric(v) && (v >= 0) && (v % 1 === 0); +}; + lib.noop = require('./noop'); lib.identity = require('./identity'); diff --git a/src/plot_api/plot_schema.js b/src/plot_api/plot_schema.js index b7487eeca0b..6f3b5e36494 100644 --- a/src/plot_api/plot_schema.js +++ b/src/plot_api/plot_schema.js @@ -437,6 +437,8 @@ function recurseIntoValObject(valObject, parts, i) { return valObject; } +// note: this is different from Lib.isIndex, this one doesn't accept numeric +// strings, only actual numbers. function isIndex(val) { return val === Math.round(val) && val >= 0; } diff --git a/src/traces/sankey/calc.js b/src/traces/sankey/calc.js index ec47f64bd19..74d2b20f236 100644 --- a/src/traces/sankey/calc.js +++ b/src/traces/sankey/calc.js @@ -14,13 +14,16 @@ var wrap = require('../../lib/gup').wrap; function circularityPresent(nodeList, sources, targets) { - var nodes = nodeList.map(function() {return [];}); + var nodes = nodeList.map(function() { return []; }); + var nodeLen = nodes.length; for(var i = 0; i < Math.min(sources.length, targets.length); i++) { - if(sources[i] === targets[i]) { - return true; // self-link which is also a scc of one + if(Lib.isIndex(sources[i], nodeLen) && Lib.isIndex(targets[i], nodeLen)) { + if(sources[i] === targets[i]) { + return true; // self-link which is also a scc of one + } + nodes[sources[i]].push(targets[i]); } - nodes[sources[i]].push(targets[i]); } var scc = tarjan(nodes); diff --git a/src/traces/sankey/defaults.js b/src/traces/sankey/defaults.js index b65899a88e4..8fb3c785a51 100644 --- a/src/traces/sankey/defaults.js +++ b/src/traces/sankey/defaults.js @@ -55,15 +55,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout Lib.coerceFont(coerce, 'textfont', Lib.extendFlat({}, layout.font)); - var missing = function(n, i) { - return traceOut.link.source.indexOf(i) === -1 && - traceOut.link.target.indexOf(i) === -1; - }; - - if(traceOut.node.label.some(missing)) { - Lib.warn('Some of the nodes are neither sources nor targets, they will not be displayed.'); - } - // disable 1D transforms - arrays here are 1D but their lengths/meanings // don't match, between nodes and links traceOut._length = null; diff --git a/src/traces/sankey/render.js b/src/traces/sankey/render.js index de2128f99e8..f084f46275a 100644 --- a/src/traces/sankey/render.js +++ b/src/traces/sankey/render.js @@ -16,9 +16,12 @@ var Drawing = require('../../components/drawing'); var d3sankey = require('@plotly/d3-sankey').sankey; var d3Force = require('d3-force'); var Lib = require('../../lib'); -var keyFun = require('../../lib/gup').keyFun; -var repeat = require('../../lib/gup').repeat; -var unwrap = require('../../lib/gup').unwrap; +var isArrayOrTypedArray = Lib.isArrayOrTypedArray; +var isIndex = Lib.isIndex; +var gup = require('../../lib/gup'); +var keyFun = gup.keyFun; +var repeat = gup.repeat; +var unwrap = gup.unwrap; // basic data utilities @@ -63,44 +66,79 @@ function switchToSankeyFormat(nodes) { // view models -function sankeyModel(layout, d, i) { - var trace = unwrap(d).trace, - domain = trace.domain, - nodeSpec = trace.node, - linkSpec = trace.link, - arrangement = trace.arrangement, - horizontal = trace.orientation === 'h', - nodePad = trace.node.pad, - nodeThickness = trace.node.thickness, - nodeLineColor = trace.node.line.color, - nodeLineWidth = trace.node.line.width, - linkLineColor = trace.link.line.color, - linkLineWidth = trace.link.line.width, - valueFormat = trace.valueformat, - valueSuffix = trace.valuesuffix, - textFont = trace.textfont; - - var width = layout.width * (domain.x[1] - domain.x[0]), - height = layout.height * (domain.y[1] - domain.y[0]); - - var nodes = nodeSpec.label.map(function(l, i) { - return { - pointNumber: i, - label: l, - color: Lib.isArrayOrTypedArray(nodeSpec.color) ? nodeSpec.color[i] : nodeSpec.color - }; - }); +function sankeyModel(layout, d, traceIndex) { + var trace = unwrap(d).trace; + var domain = trace.domain; + var nodeSpec = trace.node; + var linkSpec = trace.link; + var arrangement = trace.arrangement; + var horizontal = trace.orientation === 'h'; + var nodePad = trace.node.pad; + var nodeThickness = trace.node.thickness; + var nodeLineColor = trace.node.line.color; + var nodeLineWidth = trace.node.line.width; + var linkLineColor = trace.link.line.color; + var linkLineWidth = trace.link.line.width; + var valueFormat = trace.valueformat; + var valueSuffix = trace.valuesuffix; + var textFont = trace.textfont; + + var width = layout.width * (domain.x[1] - domain.x[0]); + var height = layout.height * (domain.y[1] - domain.y[0]); + + var links = []; + var hasLinkColorArray = isArrayOrTypedArray(linkSpec.color); + var linkedNodes = {}; + + var nodeCount = nodeSpec.label.length; + var i; + for(i = 0; i < linkSpec.value.length; i++) { + var val = linkSpec.value[i]; + // remove negative values, but keep zeros with special treatment + var source = linkSpec.source[i]; + var target = linkSpec.target[i]; + if(!(val > 0 && isIndex(source, nodeCount) && isIndex(target, nodeCount))) { + continue; + } + + source = +source; + target = +target; + linkedNodes[source] = linkedNodes[target] = true; - var links = linkSpec.value.map(function(d, i) { - return { + links.push({ pointNumber: i, label: linkSpec.label[i], - color: Lib.isArrayOrTypedArray(linkSpec.color) ? linkSpec.color[i] : linkSpec.color, - source: linkSpec.source[i], - target: linkSpec.target[i], - value: d - }; - }); + color: hasLinkColorArray ? linkSpec.color[i] : linkSpec.color, + source: source, + target: target, + value: +val + }); + } + + var hasNodeColorArray = isArrayOrTypedArray(nodeSpec.color); + var nodes = []; + var removedNodes = false; + var nodeIndices = {}; + for(i = 0; i < nodeCount; i++) { + if(linkedNodes[i]) { + var l = nodeSpec.label[i]; + nodeIndices[i] = nodes.length; + nodes.push({ + pointNumber: i, + label: l, + color: hasNodeColorArray ? nodeSpec.color[i] : nodeSpec.color + }); + } + else removedNodes = true; + } + + // need to re-index links now, since we didn't put all the nodes in + if(removedNodes) { + for(i = 0; i < links.length; i++) { + links[i].source = nodeIndices[links[i].source]; + links[i].target = nodeIndices[links[i].target]; + } + } var sankey = d3sankey() .size(horizontal ? [width, height] : [height, width]) @@ -120,7 +158,7 @@ function sankeyModel(layout, d, i) { switchToForceFormat(nodes); return { - key: i, + key: traceIndex, trace: trace, guid: Math.floor(1e12 * (1 + Math.random())), horizontal: horizontal, diff --git a/test/image/baselines/sankey_messy.png b/test/image/baselines/sankey_messy.png new file mode 100644 index 0000000000000000000000000000000000000000..e42539a8a7d6a74a22552b3a5f279af7f6777bc4 GIT binary patch literal 82729 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�*d^h>Dqa;6lQc(2Z6!e63yEmJJ{X}ZGJ?|IA+9* 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 literal 0 HcmV?d00001 diff --git a/test/image/mocks/sankey_messy.json b/test/image/mocks/sankey_messy.json new file mode 100644 index 00000000000..9d7d688bb29 --- /dev/null +++ b/test/image/mocks/sankey_messy.json @@ -0,0 +1,43 @@ +{ + "data": [ + { + "type": "sankey", + "node": { + "pad": 5, + "label": [ + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", + "10", 11, "12", 13, 14, 15, 16, 17, 18, 19, + 20, "21", 22, "23", 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + "k", "l", "m", "n", "o", "p", "q", "r", "s", "t" + ] + }, + "link": { + "source": [ + "", "x", 20, 21, 20, 21, + 20, 21, 22, 23, 24, 25, 20, 26, 22, 23, 27, 28, + 22, 29, 26, 28, 23, 30, 31, 32, 29, 26, 33, 34, + 24, 35, 36, 37, 38, 26, 22, 39, 36, 27, 26, 23, + "40", "22", "41", "35", 42, 27, 40, 20, 28 + ], + "target": [ + 10, 10, "", "q", 10, 10, + 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, + 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, + 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, + 18, 18, "18", "18", 19, 19, "19", "19", 19 + ], + "value": [ + 100, 100, 100, 100, -15, "nope", + 48, 40, 44, 4, 14, 0, 40, 25, 50, 137, 149, 100, + 100, 10, 200, 149, 237, 11, 130, 40, 10, 200, 50, 100, + 13, 100, 20, 100, 20, 100, 100, 7, 150, 40, 50, 11, + "50", 80, "2", 40, "50", 50, "90", 125, 50 + ] + } + }], + "layout": { + "title": "Sankey with messy data", + "width": 600, + "height": 800 + } +} diff --git a/test/jasmine/tests/sankey_test.js b/test/jasmine/tests/sankey_test.js index 5a666a7ac73..acc644643b3 100644 --- a/test/jasmine/tests/sankey_test.js +++ b/test/jasmine/tests/sankey_test.js @@ -58,30 +58,31 @@ describe('sankey tests', function() { }); }); - describe('log warning if issue is encountered with graph structure', - function() { - - it('some nodes are not linked', function() { - - var warnings = []; - spyOn(Lib, 'warn').and.callFake(function(msg) { - warnings.push(msg); - }); - - _supply({ - node: { - label: ['a', 'b', 'c'] - }, - link: { - value: [1], - source: [0], - target: [1] - } - }); + describe('No warnings for missing nodes', function() { + // we used to warn when some nodes were not used in the links + // not doing that anymore, it's not really consistent with + // the rest of our data processing. + it('some nodes are not linked', function() { + + var warnings = []; + spyOn(Lib, 'warn').and.callFake(function(msg) { + warnings.push(msg); + }); - expect(warnings.length).toEqual(1); + _supply({ + node: { + label: ['a', 'b', 'c'] + }, + link: { + value: [1], + source: [0], + target: [1] + } }); + + expect(warnings.length).toEqual(0); }); + }); describe('sankey global defaults', function() { From cdcd6200907d5caad164933ebbf388bc6532bf19 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 11 May 2018 17:14:57 -0400 Subject: [PATCH 3/3] :palm_tree: based on PR comments --- src/lib/index.js | 6 +----- src/traces/sankey/calc.js | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/lib/index.js b/src/lib/index.js index 82233e2eb31..a6086e300ce 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -507,10 +507,6 @@ lib.tagSelected = function(calcTrace, trace, ptNumber2cdIndex) { } } - function isPtIndexValid(v) { - return isNumeric(v) && v >= 0 && v % 1 === 0; - } - function isCdIndexValid(v) { return v !== undefined && v < calcTrace.length; } @@ -518,7 +514,7 @@ lib.tagSelected = function(calcTrace, trace, ptNumber2cdIndex) { for(var i = 0; i < selectedpoints.length; i++) { var ptIndex = selectedpoints[i]; - if(isPtIndexValid(ptIndex)) { + if(lib.isIndex(ptIndex)) { var ptNumber = ptIndex2ptNumber ? ptIndex2ptNumber[ptIndex] : ptIndex; var cdIndex = ptNumber2cdIndex ? ptNumber2cdIndex[ptNumber] : ptNumber; diff --git a/src/traces/sankey/calc.js b/src/traces/sankey/calc.js index 74d2b20f236..e9dc3bc0270 100644 --- a/src/traces/sankey/calc.js +++ b/src/traces/sankey/calc.js @@ -14,8 +14,8 @@ var wrap = require('../../lib/gup').wrap; function circularityPresent(nodeList, sources, targets) { - var nodes = nodeList.map(function() { return []; }); - var nodeLen = nodes.length; + var nodeLen = nodeList.length; + var nodes = Lib.init2dArray(nodeLen, 0); for(var i = 0; i < Math.min(sources.length, targets.length); i++) { if(Lib.isIndex(sources[i], nodeLen) && Lib.isIndex(targets[i], nodeLen)) {