diff --git a/package-lock.json b/package-lock.json index f8a995b06c2..c8ac416fd5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,9 +92,9 @@ "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" }, "@plotly/d3-sankey": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.5.0.tgz", - "integrity": "sha1-si+up0LlglEzXuXZ+6JIdyYHgA8=", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.5.1.tgz", + "integrity": "sha512-uMToNGexOSLG0hBm+uAzElfFW0Pt2utgJ//puL5nuerNnPnRTTe3Un7XFVcWqRhvXEViF00Xq/8wGoA8i8eZJA==", "requires": { "d3-array": "1", "d3-collection": "1", @@ -2249,9 +2249,9 @@ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" }, "d3-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", - "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" }, "d3-collection": { "version": "1.0.4", @@ -2259,9 +2259,9 @@ "integrity": "sha1-NC39EoN8kJdPM/HMCnha6lcNzcI=" }, "d3-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.0.tgz", - "integrity": "sha512-dmL9Zr/v39aSSMnLOTd58in2RbregCg4UtGyUArvEKTTN6S3HKEy+ziBWVYo9PTzRyVW+pUBHUtRKz0HYX+SQg==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.3.tgz", + "integrity": "sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw==" }, "d3-dispatch": { "version": "1.0.3", @@ -2280,9 +2280,9 @@ } }, "d3-interpolate": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.2.0.tgz", - "integrity": "sha512-zLvTk8CREPFfc/2XglPQriAsXkzoRDAyBzndtKJWrZmHw7kmOWHNS11e40kPTd/oGk8P5mFJW5uBbcFQ+ybxyA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", + "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", "requires": { "d3-color": "1" } diff --git a/package.json b/package.json index 92b906cd697..bbcdb31c2de 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "dependencies": { "3d-view": "^2.0.0", - "@plotly/d3-sankey": "^0.5.0", + "@plotly/d3-sankey": "^0.5.1", "alpha-shape": "^1.0.0", "array-range": "^1.0.1", "canvas-fit": "^1.5.0", diff --git a/src/traces/sankey/render.js b/src/traces/sankey/render.js index 530b7b95518..2ec53241b9c 100644 --- a/src/traces/sankey/render.js +++ b/src/traces/sankey/render.js @@ -148,6 +148,10 @@ function sankeyModel(layout, d, traceIndex) { .links(links) .layout(c.sankeyIterations); + if(sankey.nodePadding() < nodePad) { + Lib.warn('node.pad was reduced to ', sankey.nodePadding(), ' to fit within the figure.'); + } + var node, sankeyNodes = sankey.nodes(); for(var n = 0; n < sankeyNodes.length; n++) { node = sankeyNodes[n]; diff --git a/test/image/baselines/sankey_large_padding.png b/test/image/baselines/sankey_large_padding.png new file mode 100644 index 00000000000..38d263f799d Binary files /dev/null and b/test/image/baselines/sankey_large_padding.png differ diff --git a/test/image/mocks/sankey_large_padding.json b/test/image/mocks/sankey_large_padding.json new file mode 100644 index 00000000000..e01d77ded8b --- /dev/null +++ b/test/image/mocks/sankey_large_padding.json @@ -0,0 +1,301 @@ +{ + "data": [{ + "node": { + "color": [ + "#000000", + "#BFDAE3", + "#FF7080", + "#FF707F", + "#E64438", + "#B0F0FF", + "#F1483B", + "#98D6F8", + "#F2483A", + "#FF4C3C", + "#8599CC", + "#FF5446", + "#FF64FF", + "#97D6F9", + "#FE8EFE", + "#FF6F80", + "#B1BFDF", + "#B3C0DE", + "#FC8FFF", + "#FF5346", + "#90CAEC", + "#90CBED", + "#FF4B3E", + "#FE909C", + "#F2473B", + "#B0FFB8", + "#90CAED", + "#FF4A3D", + "#80C0E1", + "#F24839", + "#FF5C4E", + "#95A7D3", + "#A2B0D8", + "#96A6D2", + "#CAC7CB", + "#FD4B3C", + "#A2B1D7", + "#70FF70", + "#FF9B87", + "#FE8E9D", + "#FE5445", + "#F2483B", + "#CAC7CB", + "#CAC7CB", + "#CAC7CB", + "#CAC7CB", + "#CAC7CB", + "#FF9B87", + "#FF9B87", + "#FF9B87", + "#FF5C4E", + "#FC8FFF", + "#80C0E1", + "#70FF70", + "#70FF70" + ], + "line": { + "color": "black", + "width": 0.5 + }, + "label": [ + "root", + "grey", + "BS", + "IB", + "HY", + "CH", + "LZ", + "CNU", + "LHA", + "MEZ", + "PAL", + "PVR", + "MB", + "STR", + "MBmot", + "TH", + "PALc", + "BST", + "PAG", + "MPO", + "LSX", + "LS", + "AHN", + "DORpm", + "LPO", + "CTX", + "LSr", + "VMH", + "sAMY", + "TU", + "PVZ", + "PALm", + "PALv", + "MSC", + "fiber tracts", + "PH", + "SI", + "CTXpl", + "HB", + "MTN", + "DMH", + "RCH", + "fiber tracts#1", + "fiber tracts#2", + "fiber tracts#3", + "fiber tracts#4", + "fiber tracts#5", + "HB#3", + "HB#4", + "HB#5", + "PVZ#5", + "PAG#5", + "sAMY#5", + "CTXpl#4", + "CTXpl#5" + ], + "pad": 20, + "thickness": 50 + }, + "link": { + "source": [ + 0, + 0, + 34, + 42, + 43, + 44, + 45, + 1, + 1, + 2, + 2, + 2, + 38, + 47, + 48, + 3, + 3, + 4, + 4, + 4, + 4, + 6, + 6, + 6, + 6, + 9, + 9, + 9, + 11, + 11, + 30, + 15, + 23, + 12, + 14, + 18, + 5, + 5, + 7, + 7, + 10, + 10, + 10, + 16, + 31, + 32, + 13, + 13, + 20, + 28, + 25, + 37, + 53 + ], + "target": [ + 34, + 1, + 42, + 43, + 44, + 45, + 46, + 2, + 5, + 38, + 3, + 12, + 47, + 48, + 49, + 4, + 15, + 6, + 9, + 11, + 30, + 8, + 24, + 41, + 29, + 22, + 35, + 27, + 40, + 19, + 50, + 23, + 39, + 14, + 18, + 51, + 7, + 25, + 10, + 13, + 16, + 31, + 32, + 17, + 33, + 36, + 20, + 28, + 21, + 52, + 37, + 53, + 54 + ], + "value": [ + 1, + 1, + 0.5, + 0.3333333333333333, + 0.25, + 0.2, + 0.16666666666666666, + 0.5, + 0.5, + 0.3333333333333333, + 0.3333333333333333, + 0.3333333333333333, + 0.25, + 0.2, + 0.16666666666666666, + 0.25, + 0.25, + 0.2, + 0.2, + 0.2, + 0.2, + 0.16666666666666666, + 0.16666666666666666, + 0.16666666666666666, + 0.16666666666666666, + 0.16666666666666666, + 0.16666666666666666, + 0.16666666666666666, + 0.16666666666666666, + 0.16666666666666666, + 0.16666666666666666, + 0.2, + 0.16666666666666666, + 0.25, + 0.2, + 0.16666666666666666, + 0.3333333333333333, + 0.3333333333333333, + 0.25, + 0.25, + 0.2, + 0.2, + 0.2, + 0.16666666666666666, + 0.16666666666666666, + 0.16666666666666666, + 0.2, + 0.2, + 0.16666666666666666, + 0.16666666666666666, + 0.25, + 0.2, + 0.16666666666666666 + ] + }, + "type": "sankey", + "orientation": "h" + }], + "layout": { + "font": { + "size": 10 + }, + "title": "Injection in VISpm" + } +} diff --git a/test/jasmine/tests/sankey_test.js b/test/jasmine/tests/sankey_test.js index eb25d602b27..d5cd1f90021 100644 --- a/test/jasmine/tests/sankey_test.js +++ b/test/jasmine/tests/sankey_test.js @@ -771,6 +771,27 @@ describe('sankey tests', function() { .then(done); }); }); + + it('emits a warning if node.pad is too large', function(done) { + var gd = createGraphDiv(); + var mockCopy = Lib.extendDeep({}, mock); + + var warnings = []; + spyOn(Lib, 'warn').and.callFake(function(msg) { + warnings.push(msg); + }); + Plotly.plot(gd, mockCopy).then(function() { + expect(warnings.length).toEqual(0); + + return Plotly.restyle(gd, 'node.pad', 50); + }) + .then(function() { + expect(warnings.length).toEqual(1); + }) + .catch(failTest) + .finally(destroyGraphDiv) + .then(done); + }); }); function assertLabel(content, style) {