1 line
53 KiB
JSON
1 line
53 KiB
JSON
{"ast":null,"code":"import \"core-js/modules/es.error.cause.js\";\nimport \"core-js/modules/es.array.sort.js\";\nimport \"core-js/modules/es.object.to-string.js\";\nimport \"core-js/modules/web.dom-collections.iterator.js\";\nimport \"core-js/modules/es.array.slice.js\";\n\n/*\r\n* Licensed to the Apache Software Foundation (ASF) under one\r\n* or more contributor license agreements. See the NOTICE file\r\n* distributed with this work for additional information\r\n* regarding copyright ownership. The ASF licenses this file\r\n* to you under the Apache License, Version 2.0 (the\r\n* \"License\"); you may not use this file except in compliance\r\n* with the License. You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing,\r\n* software distributed under the License is distributed on an\r\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n* KIND, either express or implied. See the License for the\r\n* specific language governing permissions and limitations\r\n* under the License.\r\n*/\n\n/**\r\n * AUTO-GENERATED FILE. DO NOT MODIFY.\r\n */\n\n/*\r\n* Licensed to the Apache Software Foundation (ASF) under one\r\n* or more contributor license agreements. See the NOTICE file\r\n* distributed with this work for additional information\r\n* regarding copyright ownership. The ASF licenses this file\r\n* to you under the Apache License, Version 2.0 (the\r\n* \"License\"); you may not use this file except in compliance\r\n* with the License. You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing,\r\n* software distributed under the License is distributed on an\r\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n* KIND, either express or implied. See the License for the\r\n* specific language governing permissions and limitations\r\n* under the License.\r\n*/\nimport * as layout from '../../util/layout.js';\nimport * as zrUtil from 'zrender/lib/core/util.js';\nimport { groupData } from '../../util/model.js';\nexport default function sankeyLayout(ecModel, api) {\n ecModel.eachSeriesByType('sankey', function (seriesModel) {\n var nodeWidth = seriesModel.get('nodeWidth');\n var nodeGap = seriesModel.get('nodeGap');\n var layoutInfo = getViewRect(seriesModel, api);\n seriesModel.layoutInfo = layoutInfo;\n var width = layoutInfo.width;\n var height = layoutInfo.height;\n var graph = seriesModel.getGraph();\n var nodes = graph.nodes;\n var edges = graph.edges;\n computeNodeValues(nodes);\n var filteredNodes = zrUtil.filter(nodes, function (node) {\n return node.getLayout().value === 0;\n });\n var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations');\n var orient = seriesModel.get('orient');\n var nodeAlign = seriesModel.get('nodeAlign');\n layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign);\n });\n}\n/**\r\n * Get the layout position of the whole view\r\n */\n\nfunction getViewRect(seriesModel, api) {\n return layout.getLayoutRect(seriesModel.getBoxLayoutParams(), {\n width: api.getWidth(),\n height: api.getHeight()\n });\n}\n\nfunction layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign) {\n computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign);\n computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient);\n computeEdgeDepths(nodes, orient);\n}\n/**\r\n * Compute the value of each node by summing the associated edge's value\r\n */\n\n\nfunction computeNodeValues(nodes) {\n zrUtil.each(nodes, function (node) {\n var value1 = sum(node.outEdges, getEdgeValue);\n var value2 = sum(node.inEdges, getEdgeValue);\n var nodeRawValue = node.getValue() || 0;\n var value = Math.max(value1, value2, nodeRawValue);\n node.setLayout({\n value: value\n }, true);\n });\n}\n/**\r\n * Compute the x-position for each node.\r\n *\r\n * Here we use Kahn algorithm to detect cycle when we traverse\r\n * the node to computer the initial x position.\r\n */\n\n\nfunction computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign) {\n // Used to mark whether the edge is deleted. if it is deleted,\n // the value is 0, otherwise it is 1.\n var remainEdges = []; // Storage each node's indegree.\n\n var indegreeArr = []; //Used to storage the node with indegree is equal to 0.\n\n var zeroIndegrees = [];\n var nextTargetNode = [];\n var x = 0; // let kx = 0;\n\n for (var i = 0; i < edges.length; i++) {\n remainEdges[i] = 1;\n }\n\n for (var i = 0; i < nodes.length; i++) {\n indegreeArr[i] = nodes[i].inEdges.length;\n\n if (indegreeArr[i] === 0) {\n zeroIndegrees.push(nodes[i]);\n }\n }\n\n var maxNodeDepth = -1; // Traversing nodes using topological sorting to calculate the\n // horizontal(if orient === 'horizontal') or vertical(if orient === 'vertical')\n // position of the nodes.\n\n while (zeroIndegrees.length) {\n for (var idx = 0; idx < zeroIndegrees.length; idx++) {\n var node = zeroIndegrees[idx];\n var item = node.hostGraph.data.getRawDataItem(node.dataIndex);\n var isItemDepth = item.depth != null && item.depth >= 0;\n\n if (isItemDepth && item.depth > maxNodeDepth) {\n maxNodeDepth = item.depth;\n }\n\n node.setLayout({\n depth: isItemDepth ? item.depth : x\n }, true);\n orient === 'vertical' ? node.setLayout({\n dy: nodeWidth\n }, true) : node.setLayout({\n dx: nodeWidth\n }, true);\n\n for (var edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) {\n var edge = node.outEdges[edgeIdx];\n var indexEdge = edges.indexOf(edge);\n remainEdges[indexEdge] = 0;\n var targetNode = edge.node2;\n var nodeIndex = nodes.indexOf(targetNode);\n\n if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) {\n nextTargetNode.push(targetNode);\n }\n }\n }\n\n ++x;\n zeroIndegrees = nextTargetNode;\n nextTargetNode = [];\n }\n\n for (var i = 0; i < remainEdges.length; i++) {\n if (remainEdges[i] === 1) {\n throw new Error('Sankey is a DAG, the original data has cycle!');\n }\n }\n\n var maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1;\n\n if (nodeAlign && nodeAlign !== 'left') {\n adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth);\n }\n\n var kx = orient === 'vertical' ? (height - nodeWidth) / maxDepth : (width - nodeWidth) / maxDepth;\n scaleNodeBreadths(nodes, kx, orient);\n}\n\nfunction isNodeDepth(node) {\n var item = node.hostGraph.data.getRawDataItem(node.dataIndex);\n return item.depth != null && item.depth >= 0;\n}\n\nfunction adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth) {\n if (nodeAlign === 'right') {\n var nextSourceNode = [];\n var remainNodes = nodes;\n var nodeHeight = 0;\n\n while (remainNodes.length) {\n for (var i = 0; i < remainNodes.length; i++) {\n var node = remainNodes[i];\n node.setLayout({\n skNodeHeight: nodeHeight\n }, true);\n\n for (var j = 0; j < node.inEdges.length; j++) {\n var edge = node.inEdges[j];\n\n if (nextSourceNode.indexOf(edge.node1) < 0) {\n nextSourceNode.push(edge.node1);\n }\n }\n }\n\n remainNodes = nextSourceNode;\n nextSourceNode = [];\n ++nodeHeight;\n }\n\n zrUtil.each(nodes, function (node) {\n if (!isNodeDepth(node)) {\n node.setLayout({\n depth: Math.max(0, maxDepth - node.getLayout().skNodeHeight)\n }, true);\n }\n });\n } else if (nodeAlign === 'justify') {\n moveSinksRight(nodes, maxDepth);\n }\n}\n/**\r\n * All the node without outEgdes are assigned maximum x-position and\r\n * be aligned in the last column.\r\n *\r\n * @param nodes. node of sankey view.\r\n * @param maxDepth. use to assign to node without outEdges as x-position.\r\n */\n\n\nfunction moveSinksRight(nodes, maxDepth) {\n zrUtil.each(nodes, function (node) {\n if (!isNodeDepth(node) && !node.outEdges.length) {\n node.setLayout({\n depth: maxDepth\n }, true);\n }\n });\n}\n/**\r\n * Scale node x-position to the width\r\n *\r\n * @param nodes node of sankey view\r\n * @param kx multiple used to scale nodes\r\n */\n\n\nfunction scaleNodeBreadths(nodes, kx, orient) {\n zrUtil.each(nodes, function (node) {\n var nodeDepth = node.getLayout().depth * kx;\n orient === 'vertical' ? node.setLayout({\n y: nodeDepth\n }, true) : node.setLayout({\n x: nodeDepth\n }, true);\n });\n}\n/**\r\n * Using Gauss-Seidel iterations method to compute the node depth(y-position)\r\n *\r\n * @param nodes node of sankey view\r\n * @param edges edge of sankey view\r\n * @param height the whole height of the area to draw the view\r\n * @param nodeGap the vertical distance between two nodes\r\n * in the same column.\r\n * @param iterations the number of iterations for the algorithm\r\n */\n\n\nfunction computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) {\n var nodesByBreadth = prepareNodesByBreadth(nodes, orient);\n initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient);\n resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n\n for (var alpha = 1; iterations > 0; iterations--) {\n // 0.99 is a experience parameter, ensure that each iterations of\n // changes as small as possible.\n alpha *= 0.99;\n relaxRightToLeft(nodesByBreadth, alpha, orient);\n resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n relaxLeftToRight(nodesByBreadth, alpha, orient);\n resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\n }\n}\n\nfunction prepareNodesByBreadth(nodes, orient) {\n var nodesByBreadth = [];\n var keyAttr = orient === 'vertical' ? 'y' : 'x';\n var groupResult = groupData(nodes, function (node) {\n return node.getLayout()[keyAttr];\n });\n groupResult.keys.sort(function (a, b) {\n return a - b;\n });\n zrUtil.each(groupResult.keys, function (key) {\n nodesByBreadth.push(groupResult.buckets.get(key));\n });\n return nodesByBreadth;\n}\n/**\r\n * Compute the original y-position for each node\r\n */\n\n\nfunction initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient) {\n var minKy = Infinity;\n zrUtil.each(nodesByBreadth, function (nodes) {\n var n = nodes.length;\n var sum = 0;\n zrUtil.each(nodes, function (node) {\n sum += node.getLayout().value;\n });\n var ky = orient === 'vertical' ? (width - (n - 1) * nodeGap) / sum : (height - (n - 1) * nodeGap) / sum;\n\n if (ky < minKy) {\n minKy = ky;\n }\n });\n zrUtil.each(nodesByBreadth, function (nodes) {\n zrUtil.each(nodes, function (node, i) {\n var nodeDy = node.getLayout().value * minKy;\n\n if (orient === 'vertical') {\n node.setLayout({\n x: i\n }, true);\n node.setLayout({\n dx: nodeDy\n }, true);\n } else {\n node.setLayout({\n y: i\n }, true);\n node.setLayout({\n dy: nodeDy\n }, true);\n }\n });\n });\n zrUtil.each(edges, function (edge) {\n var edgeDy = +edge.getValue() * minKy;\n edge.setLayout({\n dy: edgeDy\n }, true);\n });\n}\n/**\r\n * Resolve the collision of initialized depth (y-position)\r\n */\n\n\nfunction resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) {\n var keyAttr = orient === 'vertical' ? 'x' : 'y';\n zrUtil.each(nodesByBreadth, function (nodes) {\n nodes.sort(function (a, b) {\n return a.getLayout()[keyAttr] - b.getLayout()[keyAttr];\n });\n var nodeX;\n var node;\n var dy;\n var y0 = 0;\n var n = nodes.length;\n var nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy';\n\n for (var i = 0; i < n; i++) {\n node = nodes[i];\n dy = y0 - node.getLayout()[keyAttr];\n\n if (dy > 0) {\n nodeX = node.getLayout()[keyAttr] + dy;\n orient === 'vertical' ? node.setLayout({\n x: nodeX\n }, true) : node.setLayout({\n y: nodeX\n }, true);\n }\n\n y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap;\n }\n\n var viewWidth = orient === 'vertical' ? width : height; // If the bottommost node goes outside the bounds, push it back up\n\n dy = y0 - nodeGap - viewWidth;\n\n if (dy > 0) {\n nodeX = node.getLayout()[keyAttr] - dy;\n orient === 'vertical' ? node.setLayout({\n x: nodeX\n }, true) : node.setLayout({\n y: nodeX\n }, true);\n y0 = nodeX;\n\n for (var i = n - 2; i >= 0; --i) {\n node = nodes[i];\n dy = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap - y0;\n\n if (dy > 0) {\n nodeX = node.getLayout()[keyAttr] - dy;\n orient === 'vertical' ? node.setLayout({\n x: nodeX\n }, true) : node.setLayout({\n y: nodeX\n }, true);\n }\n\n y0 = node.getLayout()[keyAttr];\n }\n }\n });\n}\n/**\r\n * Change the y-position of the nodes, except most the right side nodes\r\n * @param nodesByBreadth\r\n * @param alpha parameter used to adjust the nodes y-position\r\n */\n\n\nfunction relaxRightToLeft(nodesByBreadth, alpha, orient) {\n zrUtil.each(nodesByBreadth.slice().reverse(), function (nodes) {\n zrUtil.each(nodes, function (node) {\n if (node.outEdges.length) {\n var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue);\n\n if (isNaN(y)) {\n var len = node.outEdges.length;\n y = len ? sum(node.outEdges, centerTarget, orient) / len : 0;\n }\n\n if (orient === 'vertical') {\n var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;\n node.setLayout({\n x: nodeX\n }, true);\n } else {\n var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;\n node.setLayout({\n y: nodeY\n }, true);\n }\n }\n });\n });\n}\n\nfunction weightedTarget(edge, orient) {\n return center(edge.node2, orient) * edge.getValue();\n}\n\nfunction centerTarget(edge, orient) {\n return center(edge.node2, orient);\n}\n\nfunction weightedSource(edge, orient) {\n return center(edge.node1, orient) * edge.getValue();\n}\n\nfunction centerSource(edge, orient) {\n return center(edge.node1, orient);\n}\n\nfunction center(node, orient) {\n return orient === 'vertical' ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2;\n}\n\nfunction getEdgeValue(edge) {\n return edge.getValue();\n}\n\nfunction sum(array, cb, orient) {\n var sum = 0;\n var len = array.length;\n var i = -1;\n\n while (++i < len) {\n var value = +cb(array[i], orient);\n\n if (!isNaN(value)) {\n sum += value;\n }\n }\n\n return sum;\n}\n/**\r\n * Change the y-position of the nodes, except most the left side nodes\r\n */\n\n\nfunction relaxLeftToRight(nodesByBreadth, alpha, orient) {\n zrUtil.each(nodesByBreadth, function (nodes) {\n zrUtil.each(nodes, function (node) {\n if (node.inEdges.length) {\n var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue);\n\n if (isNaN(y)) {\n var len = node.inEdges.length;\n y = len ? sum(node.inEdges, centerSource, orient) / len : 0;\n }\n\n if (orient === 'vertical') {\n var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;\n node.setLayout({\n x: nodeX\n }, true);\n } else {\n var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;\n node.setLayout({\n y: nodeY\n }, true);\n }\n }\n });\n });\n}\n/**\r\n * Compute the depth(y-position) of each edge\r\n */\n\n\nfunction computeEdgeDepths(nodes, orient) {\n var keyAttr = orient === 'vertical' ? 'x' : 'y';\n zrUtil.each(nodes, function (node) {\n node.outEdges.sort(function (a, b) {\n return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr];\n });\n node.inEdges.sort(function (a, b) {\n return a.node1.getLayout()[keyAttr] - b.node1.getLayout()[keyAttr];\n });\n });\n zrUtil.each(nodes, function (node) {\n var sy = 0;\n var ty = 0;\n zrUtil.each(node.outEdges, function (edge) {\n edge.setLayout({\n sy: sy\n }, true);\n sy += edge.getLayout().dy;\n });\n zrUtil.each(node.inEdges, function (edge) {\n edge.setLayout({\n ty: ty\n }, true);\n ty += edge.getLayout().dy;\n });\n });\n}","map":{"version":3,"sources":["D:/Work/WorkSpace/GitWorkSpace/TenShop/resource/ElectronicMall/src/qingge-Market/qingge-vue/node_modules/echarts/lib/chart/sankey/sankeyLayout.js"],"names":["layout","zrUtil","groupData","sankeyLayout","ecModel","api","eachSeriesByType","seriesModel","nodeWidth","get","nodeGap","layoutInfo","getViewRect","width","height","graph","getGraph","nodes","edges","computeNodeValues","filteredNodes","filter","node","getLayout","value","iterations","length","orient","nodeAlign","layoutSankey","getLayoutRect","getBoxLayoutParams","getWidth","getHeight","computeNodeBreadths","computeNodeDepths","computeEdgeDepths","each","value1","sum","outEdges","getEdgeValue","value2","inEdges","nodeRawValue","getValue","Math","max","setLayout","remainEdges","indegreeArr","zeroIndegrees","nextTargetNode","x","i","push","maxNodeDepth","idx","item","hostGraph","data","getRawDataItem","dataIndex","isItemDepth","depth","dy","dx","edgeIdx","edge","indexEdge","indexOf","targetNode","node2","nodeIndex","Error","maxDepth","adjustNodeWithNodeAlign","kx","scaleNodeBreadths","isNodeDepth","nextSourceNode","remainNodes","nodeHeight","skNodeHeight","j","node1","moveSinksRight","nodeDepth","y","nodesByBreadth","prepareNodesByBreadth","initializeNodeDepth","resolveCollisions","alpha","relaxRightToLeft","relaxLeftToRight","keyAttr","groupResult","keys","sort","a","b","key","buckets","minKy","Infinity","n","ky","nodeDy","edgeDy","nodeX","y0","nodeDyAttr","viewWidth","slice","reverse","weightedTarget","isNaN","len","centerTarget","center","nodeY","weightedSource","centerSource","array","cb","sy","ty"],"mappings":"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","sourcesContent":["\r\n/*\r\n* Licensed to the Apache Software Foundation (ASF) under one\r\n* or more contributor license agreements. See the NOTICE file\r\n* distributed with this work for additional information\r\n* regarding copyright ownership. The ASF licenses this file\r\n* to you under the Apache License, Version 2.0 (the\r\n* \"License\"); you may not use this file except in compliance\r\n* with the License. You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing,\r\n* software distributed under the License is distributed on an\r\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n* KIND, either express or implied. See the License for the\r\n* specific language governing permissions and limitations\r\n* under the License.\r\n*/\r\n\r\n\r\n/**\r\n * AUTO-GENERATED FILE. DO NOT MODIFY.\r\n */\r\n\r\n/*\r\n* Licensed to the Apache Software Foundation (ASF) under one\r\n* or more contributor license agreements. See the NOTICE file\r\n* distributed with this work for additional information\r\n* regarding copyright ownership. The ASF licenses this file\r\n* to you under the Apache License, Version 2.0 (the\r\n* \"License\"); you may not use this file except in compliance\r\n* with the License. You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing,\r\n* software distributed under the License is distributed on an\r\n* \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n* KIND, either express or implied. See the License for the\r\n* specific language governing permissions and limitations\r\n* under the License.\r\n*/\r\nimport * as layout from '../../util/layout.js';\r\nimport * as zrUtil from 'zrender/lib/core/util.js';\r\nimport { groupData } from '../../util/model.js';\r\nexport default function sankeyLayout(ecModel, api) {\r\n ecModel.eachSeriesByType('sankey', function (seriesModel) {\r\n var nodeWidth = seriesModel.get('nodeWidth');\r\n var nodeGap = seriesModel.get('nodeGap');\r\n var layoutInfo = getViewRect(seriesModel, api);\r\n seriesModel.layoutInfo = layoutInfo;\r\n var width = layoutInfo.width;\r\n var height = layoutInfo.height;\r\n var graph = seriesModel.getGraph();\r\n var nodes = graph.nodes;\r\n var edges = graph.edges;\r\n computeNodeValues(nodes);\r\n var filteredNodes = zrUtil.filter(nodes, function (node) {\r\n return node.getLayout().value === 0;\r\n });\r\n var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations');\r\n var orient = seriesModel.get('orient');\r\n var nodeAlign = seriesModel.get('nodeAlign');\r\n layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign);\r\n });\r\n}\r\n/**\r\n * Get the layout position of the whole view\r\n */\r\n\r\nfunction getViewRect(seriesModel, api) {\r\n return layout.getLayoutRect(seriesModel.getBoxLayoutParams(), {\r\n width: api.getWidth(),\r\n height: api.getHeight()\r\n });\r\n}\r\n\r\nfunction layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign) {\r\n computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign);\r\n computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient);\r\n computeEdgeDepths(nodes, orient);\r\n}\r\n/**\r\n * Compute the value of each node by summing the associated edge's value\r\n */\r\n\r\n\r\nfunction computeNodeValues(nodes) {\r\n zrUtil.each(nodes, function (node) {\r\n var value1 = sum(node.outEdges, getEdgeValue);\r\n var value2 = sum(node.inEdges, getEdgeValue);\r\n var nodeRawValue = node.getValue() || 0;\r\n var value = Math.max(value1, value2, nodeRawValue);\r\n node.setLayout({\r\n value: value\r\n }, true);\r\n });\r\n}\r\n/**\r\n * Compute the x-position for each node.\r\n *\r\n * Here we use Kahn algorithm to detect cycle when we traverse\r\n * the node to computer the initial x position.\r\n */\r\n\r\n\r\nfunction computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient, nodeAlign) {\r\n // Used to mark whether the edge is deleted. if it is deleted,\r\n // the value is 0, otherwise it is 1.\r\n var remainEdges = []; // Storage each node's indegree.\r\n\r\n var indegreeArr = []; //Used to storage the node with indegree is equal to 0.\r\n\r\n var zeroIndegrees = [];\r\n var nextTargetNode = [];\r\n var x = 0; // let kx = 0;\r\n\r\n for (var i = 0; i < edges.length; i++) {\r\n remainEdges[i] = 1;\r\n }\r\n\r\n for (var i = 0; i < nodes.length; i++) {\r\n indegreeArr[i] = nodes[i].inEdges.length;\r\n\r\n if (indegreeArr[i] === 0) {\r\n zeroIndegrees.push(nodes[i]);\r\n }\r\n }\r\n\r\n var maxNodeDepth = -1; // Traversing nodes using topological sorting to calculate the\r\n // horizontal(if orient === 'horizontal') or vertical(if orient === 'vertical')\r\n // position of the nodes.\r\n\r\n while (zeroIndegrees.length) {\r\n for (var idx = 0; idx < zeroIndegrees.length; idx++) {\r\n var node = zeroIndegrees[idx];\r\n var item = node.hostGraph.data.getRawDataItem(node.dataIndex);\r\n var isItemDepth = item.depth != null && item.depth >= 0;\r\n\r\n if (isItemDepth && item.depth > maxNodeDepth) {\r\n maxNodeDepth = item.depth;\r\n }\r\n\r\n node.setLayout({\r\n depth: isItemDepth ? item.depth : x\r\n }, true);\r\n orient === 'vertical' ? node.setLayout({\r\n dy: nodeWidth\r\n }, true) : node.setLayout({\r\n dx: nodeWidth\r\n }, true);\r\n\r\n for (var edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) {\r\n var edge = node.outEdges[edgeIdx];\r\n var indexEdge = edges.indexOf(edge);\r\n remainEdges[indexEdge] = 0;\r\n var targetNode = edge.node2;\r\n var nodeIndex = nodes.indexOf(targetNode);\r\n\r\n if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) {\r\n nextTargetNode.push(targetNode);\r\n }\r\n }\r\n }\r\n\r\n ++x;\r\n zeroIndegrees = nextTargetNode;\r\n nextTargetNode = [];\r\n }\r\n\r\n for (var i = 0; i < remainEdges.length; i++) {\r\n if (remainEdges[i] === 1) {\r\n throw new Error('Sankey is a DAG, the original data has cycle!');\r\n }\r\n }\r\n\r\n var maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1;\r\n\r\n if (nodeAlign && nodeAlign !== 'left') {\r\n adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth);\r\n }\r\n\r\n var kx = orient === 'vertical' ? (height - nodeWidth) / maxDepth : (width - nodeWidth) / maxDepth;\r\n scaleNodeBreadths(nodes, kx, orient);\r\n}\r\n\r\nfunction isNodeDepth(node) {\r\n var item = node.hostGraph.data.getRawDataItem(node.dataIndex);\r\n return item.depth != null && item.depth >= 0;\r\n}\r\n\r\nfunction adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth) {\r\n if (nodeAlign === 'right') {\r\n var nextSourceNode = [];\r\n var remainNodes = nodes;\r\n var nodeHeight = 0;\r\n\r\n while (remainNodes.length) {\r\n for (var i = 0; i < remainNodes.length; i++) {\r\n var node = remainNodes[i];\r\n node.setLayout({\r\n skNodeHeight: nodeHeight\r\n }, true);\r\n\r\n for (var j = 0; j < node.inEdges.length; j++) {\r\n var edge = node.inEdges[j];\r\n\r\n if (nextSourceNode.indexOf(edge.node1) < 0) {\r\n nextSourceNode.push(edge.node1);\r\n }\r\n }\r\n }\r\n\r\n remainNodes = nextSourceNode;\r\n nextSourceNode = [];\r\n ++nodeHeight;\r\n }\r\n\r\n zrUtil.each(nodes, function (node) {\r\n if (!isNodeDepth(node)) {\r\n node.setLayout({\r\n depth: Math.max(0, maxDepth - node.getLayout().skNodeHeight)\r\n }, true);\r\n }\r\n });\r\n } else if (nodeAlign === 'justify') {\r\n moveSinksRight(nodes, maxDepth);\r\n }\r\n}\r\n/**\r\n * All the node without outEgdes are assigned maximum x-position and\r\n * be aligned in the last column.\r\n *\r\n * @param nodes. node of sankey view.\r\n * @param maxDepth. use to assign to node without outEdges as x-position.\r\n */\r\n\r\n\r\nfunction moveSinksRight(nodes, maxDepth) {\r\n zrUtil.each(nodes, function (node) {\r\n if (!isNodeDepth(node) && !node.outEdges.length) {\r\n node.setLayout({\r\n depth: maxDepth\r\n }, true);\r\n }\r\n });\r\n}\r\n/**\r\n * Scale node x-position to the width\r\n *\r\n * @param nodes node of sankey view\r\n * @param kx multiple used to scale nodes\r\n */\r\n\r\n\r\nfunction scaleNodeBreadths(nodes, kx, orient) {\r\n zrUtil.each(nodes, function (node) {\r\n var nodeDepth = node.getLayout().depth * kx;\r\n orient === 'vertical' ? node.setLayout({\r\n y: nodeDepth\r\n }, true) : node.setLayout({\r\n x: nodeDepth\r\n }, true);\r\n });\r\n}\r\n/**\r\n * Using Gauss-Seidel iterations method to compute the node depth(y-position)\r\n *\r\n * @param nodes node of sankey view\r\n * @param edges edge of sankey view\r\n * @param height the whole height of the area to draw the view\r\n * @param nodeGap the vertical distance between two nodes\r\n * in the same column.\r\n * @param iterations the number of iterations for the algorithm\r\n */\r\n\r\n\r\nfunction computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) {\r\n var nodesByBreadth = prepareNodesByBreadth(nodes, orient);\r\n initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient);\r\n resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\r\n\r\n for (var alpha = 1; iterations > 0; iterations--) {\r\n // 0.99 is a experience parameter, ensure that each iterations of\r\n // changes as small as possible.\r\n alpha *= 0.99;\r\n relaxRightToLeft(nodesByBreadth, alpha, orient);\r\n resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\r\n relaxLeftToRight(nodesByBreadth, alpha, orient);\r\n resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);\r\n }\r\n}\r\n\r\nfunction prepareNodesByBreadth(nodes, orient) {\r\n var nodesByBreadth = [];\r\n var keyAttr = orient === 'vertical' ? 'y' : 'x';\r\n var groupResult = groupData(nodes, function (node) {\r\n return node.getLayout()[keyAttr];\r\n });\r\n groupResult.keys.sort(function (a, b) {\r\n return a - b;\r\n });\r\n zrUtil.each(groupResult.keys, function (key) {\r\n nodesByBreadth.push(groupResult.buckets.get(key));\r\n });\r\n return nodesByBreadth;\r\n}\r\n/**\r\n * Compute the original y-position for each node\r\n */\r\n\r\n\r\nfunction initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient) {\r\n var minKy = Infinity;\r\n zrUtil.each(nodesByBreadth, function (nodes) {\r\n var n = nodes.length;\r\n var sum = 0;\r\n zrUtil.each(nodes, function (node) {\r\n sum += node.getLayout().value;\r\n });\r\n var ky = orient === 'vertical' ? (width - (n - 1) * nodeGap) / sum : (height - (n - 1) * nodeGap) / sum;\r\n\r\n if (ky < minKy) {\r\n minKy = ky;\r\n }\r\n });\r\n zrUtil.each(nodesByBreadth, function (nodes) {\r\n zrUtil.each(nodes, function (node, i) {\r\n var nodeDy = node.getLayout().value * minKy;\r\n\r\n if (orient === 'vertical') {\r\n node.setLayout({\r\n x: i\r\n }, true);\r\n node.setLayout({\r\n dx: nodeDy\r\n }, true);\r\n } else {\r\n node.setLayout({\r\n y: i\r\n }, true);\r\n node.setLayout({\r\n dy: nodeDy\r\n }, true);\r\n }\r\n });\r\n });\r\n zrUtil.each(edges, function (edge) {\r\n var edgeDy = +edge.getValue() * minKy;\r\n edge.setLayout({\r\n dy: edgeDy\r\n }, true);\r\n });\r\n}\r\n/**\r\n * Resolve the collision of initialized depth (y-position)\r\n */\r\n\r\n\r\nfunction resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) {\r\n var keyAttr = orient === 'vertical' ? 'x' : 'y';\r\n zrUtil.each(nodesByBreadth, function (nodes) {\r\n nodes.sort(function (a, b) {\r\n return a.getLayout()[keyAttr] - b.getLayout()[keyAttr];\r\n });\r\n var nodeX;\r\n var node;\r\n var dy;\r\n var y0 = 0;\r\n var n = nodes.length;\r\n var nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy';\r\n\r\n for (var i = 0; i < n; i++) {\r\n node = nodes[i];\r\n dy = y0 - node.getLayout()[keyAttr];\r\n\r\n if (dy > 0) {\r\n nodeX = node.getLayout()[keyAttr] + dy;\r\n orient === 'vertical' ? node.setLayout({\r\n x: nodeX\r\n }, true) : node.setLayout({\r\n y: nodeX\r\n }, true);\r\n }\r\n\r\n y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap;\r\n }\r\n\r\n var viewWidth = orient === 'vertical' ? width : height; // If the bottommost node goes outside the bounds, push it back up\r\n\r\n dy = y0 - nodeGap - viewWidth;\r\n\r\n if (dy > 0) {\r\n nodeX = node.getLayout()[keyAttr] - dy;\r\n orient === 'vertical' ? node.setLayout({\r\n x: nodeX\r\n }, true) : node.setLayout({\r\n y: nodeX\r\n }, true);\r\n y0 = nodeX;\r\n\r\n for (var i = n - 2; i >= 0; --i) {\r\n node = nodes[i];\r\n dy = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap - y0;\r\n\r\n if (dy > 0) {\r\n nodeX = node.getLayout()[keyAttr] - dy;\r\n orient === 'vertical' ? node.setLayout({\r\n x: nodeX\r\n }, true) : node.setLayout({\r\n y: nodeX\r\n }, true);\r\n }\r\n\r\n y0 = node.getLayout()[keyAttr];\r\n }\r\n }\r\n });\r\n}\r\n/**\r\n * Change the y-position of the nodes, except most the right side nodes\r\n * @param nodesByBreadth\r\n * @param alpha parameter used to adjust the nodes y-position\r\n */\r\n\r\n\r\nfunction relaxRightToLeft(nodesByBreadth, alpha, orient) {\r\n zrUtil.each(nodesByBreadth.slice().reverse(), function (nodes) {\r\n zrUtil.each(nodes, function (node) {\r\n if (node.outEdges.length) {\r\n var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue);\r\n\r\n if (isNaN(y)) {\r\n var len = node.outEdges.length;\r\n y = len ? sum(node.outEdges, centerTarget, orient) / len : 0;\r\n }\r\n\r\n if (orient === 'vertical') {\r\n var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;\r\n node.setLayout({\r\n x: nodeX\r\n }, true);\r\n } else {\r\n var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;\r\n node.setLayout({\r\n y: nodeY\r\n }, true);\r\n }\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction weightedTarget(edge, orient) {\r\n return center(edge.node2, orient) * edge.getValue();\r\n}\r\n\r\nfunction centerTarget(edge, orient) {\r\n return center(edge.node2, orient);\r\n}\r\n\r\nfunction weightedSource(edge, orient) {\r\n return center(edge.node1, orient) * edge.getValue();\r\n}\r\n\r\nfunction centerSource(edge, orient) {\r\n return center(edge.node1, orient);\r\n}\r\n\r\nfunction center(node, orient) {\r\n return orient === 'vertical' ? node.getLayout().x + node.getLayout().dx / 2 : node.getLayout().y + node.getLayout().dy / 2;\r\n}\r\n\r\nfunction getEdgeValue(edge) {\r\n return edge.getValue();\r\n}\r\n\r\nfunction sum(array, cb, orient) {\r\n var sum = 0;\r\n var len = array.length;\r\n var i = -1;\r\n\r\n while (++i < len) {\r\n var value = +cb(array[i], orient);\r\n\r\n if (!isNaN(value)) {\r\n sum += value;\r\n }\r\n }\r\n\r\n return sum;\r\n}\r\n/**\r\n * Change the y-position of the nodes, except most the left side nodes\r\n */\r\n\r\n\r\nfunction relaxLeftToRight(nodesByBreadth, alpha, orient) {\r\n zrUtil.each(nodesByBreadth, function (nodes) {\r\n zrUtil.each(nodes, function (node) {\r\n if (node.inEdges.length) {\r\n var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue);\r\n\r\n if (isNaN(y)) {\r\n var len = node.inEdges.length;\r\n y = len ? sum(node.inEdges, centerSource, orient) / len : 0;\r\n }\r\n\r\n if (orient === 'vertical') {\r\n var nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;\r\n node.setLayout({\r\n x: nodeX\r\n }, true);\r\n } else {\r\n var nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;\r\n node.setLayout({\r\n y: nodeY\r\n }, true);\r\n }\r\n }\r\n });\r\n });\r\n}\r\n/**\r\n * Compute the depth(y-position) of each edge\r\n */\r\n\r\n\r\nfunction computeEdgeDepths(nodes, orient) {\r\n var keyAttr = orient === 'vertical' ? 'x' : 'y';\r\n zrUtil.each(nodes, function (node) {\r\n node.outEdges.sort(function (a, b) {\r\n return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr];\r\n });\r\n node.inEdges.sort(function (a, b) {\r\n return a.node1.getLayout()[keyAttr] - b.node1.getLayout()[keyAttr];\r\n });\r\n });\r\n zrUtil.each(nodes, function (node) {\r\n var sy = 0;\r\n var ty = 0;\r\n zrUtil.each(node.outEdges, function (edge) {\r\n edge.setLayout({\r\n sy: sy\r\n }, true);\r\n sy += edge.getLayout().dy;\r\n });\r\n zrUtil.each(node.inEdges, function (edge) {\r\n edge.setLayout({\r\n ty: ty\r\n }, true);\r\n ty += edge.getLayout().dy;\r\n });\r\n });\r\n}"]},"metadata":{},"sourceType":"module"} |