提交 94c7eb6a 编写于 作者: S sushuang 提交者: GitHub

Merge pull request #6816 from ecomfe/hierarchy

Hierarchy
......@@ -43,7 +43,6 @@ define(function (require) {
// Remove paths created before
this.removeAll();
var seriesModel = data.hostModel;
var color = data.getItemVisual(idx, 'color');
// var symbolPath = symbolUtil.createSymbol(
......@@ -59,14 +58,11 @@ define(function (require) {
symbolPath.attr({
z2: 100,
culling: true,
scale: [0, 0]
scale: getScale(symbolSize)
});
// Rewrite drift method
symbolPath.drift = driftSymbol;
graphic.initProps(symbolPath, {
scale: getScale(symbolSize)
}, seriesModel, idx);
this._symbolType = symbolType;
this.add(symbolPath);
......@@ -81,7 +77,13 @@ define(function (require) {
};
/**
* Get symbol path element
* FIXME:
* Caution: This method breaks the encapsulation of this module,
* but it indeed brings convenience. So do not use the method
* unless you detailedly know all the implements of `Symbol`,
* especially animation.
*
* Get symbol path element.
*/
symbolProto.getSymbolPath = function () {
return this.childAt(0);
......@@ -127,8 +129,20 @@ define(function (require) {
/**
* Update symbol properties
* @param {module:echarts/data/List} data
* @param {number} idx
* @param {module:echarts/data/List} data
* @param {number} idx
* @param {Object} [seriesScope]
* @param {Object} [seriesScope.itemStyle]
* @param {Object} [seriesScope.hoverItemStyle]
* @param {Object} [seriesScope.symbolRotate]
* @param {Object} [seriesScope.symbolOffset]
* @param {module:echarts/model/Model} [seriesScope.labelModel]
* @param {module:echarts/model/Model} [seriesScope.hoverLabelModel]
* @param {boolean} [seriesScope.hoverAnimation]
* @param {Object} [seriesScope.cursorStyle]
* @param {module:echarts/model/Model} [seriesScope.itemModel]
* @param {string} [seriesScope.symbolInnerColor]
* @param {Object} [seriesScope.fadeIn=false]
*/
symbolProto.updateData = function (data, idx, seriesScope) {
this.silent = false;
......@@ -136,8 +150,9 @@ define(function (require) {
var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';
var seriesModel = data.hostModel;
var symbolSize = getSymbolSize(data, idx);
var isInit = symbolType !== this._symbolType;
if (symbolType !== this._symbolType) {
if (isInit) {
this._createSymbol(symbolType, data, idx, symbolSize);
}
else {
......@@ -147,7 +162,22 @@ define(function (require) {
scale: getScale(symbolSize)
}, seriesModel, idx);
}
this._updateCommon(data, idx, symbolSize, seriesScope);
if (isInit) {
var symbolPath = this.childAt(0);
var fadeIn = seriesScope && seriesScope.fadeIn;
var target = {scale: symbolPath.scale.slice()};
fadeIn && (target.style = {opacity: symbolPath.style.opacity});
symbolPath.scale = [0, 0];
fadeIn && (symbolPath.style.opacity = 0);
graphic.initProps(symbolPath, target, seriesModel, idx);
}
this._seriesModel = seriesModel;
};
......@@ -169,8 +199,6 @@ define(function (require) {
});
}
seriesScope = seriesScope || null;
var itemStyle = seriesScope && seriesScope.itemStyle;
var hoverItemStyle = seriesScope && seriesScope.hoverItemStyle;
var symbolRotate = seriesScope && seriesScope.symbolRotate;
......@@ -181,7 +209,8 @@ define(function (require) {
var cursorStyle = seriesScope && seriesScope.cursorStyle;
if (!seriesScope || data.hasItemOption) {
var itemModel = data.getItemModel(idx);
var itemModel = (seriesScope && seriesScope.itemModel)
? seriesScope.itemModel : data.getItemModel(idx);
// Color must be excluded.
// Because symbol provide setColor individually to set fill and stroke
......@@ -214,7 +243,7 @@ define(function (require) {
cursorStyle && symbolPath.attr('cursor', cursorStyle);
// PENDING setColor before setStyle!!!
symbolPath.setColor(color);
seriesScope && symbolPath.setColor(color, seriesScope.symbolInnerColor);
symbolPath.setStyle(itemStyle);
......@@ -223,15 +252,23 @@ define(function (require) {
elStyle.opacity = opacity;
}
var valueDim = labelHelper.findLabelValueDim(data);
var useNameLabel = seriesScope && seriesScope.useNameLabel;
var valueDim = !useNameLabel && labelHelper.findLabelValueDim(data);
// labelHelper.setTextToStyle(
// data, idx, valueDim, elStyle, seriesModel, labelModel, color
// );
// labelHelper.setTextToStyle(
// data, idx, valueDim, hoverItemStyle, seriesModel, hoverLabelModel, color
// );
if (valueDim != null) {
if (useNameLabel || valueDim != null) {
graphic.setLabelStyle(
elStyle, hoverItemStyle, labelModel, hoverLabelModel,
{
labelFetcher: seriesModel,
labelDataIndex: idx,
defaultText: data.get(valueDim, idx),
defaultText: useNameLabel ? data.getName(idx) : data.get(valueDim, idx),
isRectText: true,
autoColor: color
}
......@@ -273,15 +310,28 @@ define(function (require) {
}
};
symbolProto.fadeOut = function (cb) {
/**
* @param {Function} cb
* @param {Object} [opt]
* @param {Object} [opt.keepLabel=true]
*/
symbolProto.fadeOut = function (cb, opt) {
var symbolPath = this.childAt(0);
// Avoid mistaken hover when fading out
this.silent = symbolPath.silent = true;
// Not show text when animating
symbolPath.style.text = null;
graphic.updateProps(symbolPath, {
scale: [0, 0]
}, this._seriesModel, this.dataIndex, cb);
!(opt && opt.keepLabel) && (symbolPath.style.text = null);
graphic.updateProps(
symbolPath,
{
style: {opacity: 0},
scale: [0, 0]
},
this._seriesModel,
this.dataIndex,
cb
);
};
zrUtil.inherits(Symbol, graphic.Group);
......
......@@ -4,6 +4,7 @@
define(function (require) {
var modelUtil = require('../../util/model');
var zrUtil = require('zrender/core/util');
var helper = {};
......@@ -28,5 +29,22 @@ define(function (require) {
return valueDim;
};
helper.setTextToStyle = function (
data, dataIndex, valueDim, elStyle, seriesModel, labelModel, color
) {
if (valueDim != null && labelModel.getShallow('show')) {
graphic.setText(elStyle, labelModel, color);
elStyle.text = zrUtil.retrieve(
seriesModel.getFormattedLabel(dataIndex, 'normal'),
valueDim === 'ecDataItemName'
? data.getName(dataIndex)
: data.get(valueDim, dataIndex)
);
}
else {
elStyle.text = '';
}
};
return helper;
});
\ No newline at end of file
......@@ -55,7 +55,7 @@ define(function (require) {
group.removeAll();
group.position = [layoutInfo.x, layoutInfo.y];
group.attr('position', [layoutInfo.x, layoutInfo.y]);
// generate a bezire Curve for each edge
graph.eachEdge(function (edge) {
......
define(function (require) {
var echarts = require('../echarts');
var zrUtil = require('zrender/core/util');
require('./tree/TreeSeries');
require('./tree/TreeView');
require('./tree/treeAction');
echarts.registerVisual(zrUtil.curry(
require('../visual/symbol'), 'tree', 'circle', null
));
echarts.registerLayout(require('./tree/orthogonalLayout'));
echarts.registerLayout(require('./tree/radialLayout'));
});
\ No newline at end of file
/**
* @file Create data struct and define tree view's series model
*/
define(function (require) {
var SeriesModel = require('../../model/Series');
var Tree = require('../../data/Tree');
var encodeHTML = require('../../util/format').encodeHTML;
return SeriesModel.extend({
type: 'series.tree',
layoutInfo: null,
// can support the position parameters 'left', 'top','right','bottom', 'width',
// 'height' in the setOption() with 'merge' mode normal.
layoutMode: 'box',
/**
* Init a tree data structure from data in option series
* @param {Object} option the object used to config echarts view
* @return {module:echarts/data/List} storage initial data
*/
getInitialData: function (option) {
//create an virtual root
var root = {name: option.name, children: option.data};
var leaves = option.leaves || {};
var treeOption = {};
treeOption.leaves = leaves;
var tree = Tree.createTree(root, this, treeOption);
var treeDepth = 0;
tree.eachNode('preorder', function (node) {
if (node.depth > treeDepth) {
treeDepth = node.depth;
}
});
var expandAndCollapse = option.expandAndCollapse;
var expandTreeDepth = expandAndCollapse ? (option.initialTreeDepth >= 1 ? option.initialTreeDepth : 1) : treeDepth;
tree.root.eachNode('preorder', function (node) {
if (node.depth <= expandTreeDepth) {
node.isExpand = true;
}
else {
node.isExpand = false;
}
});
return tree.data;
},
/**
* @override
* @param {number} dataIndex
*/
formatTooltip: function (dataIndex) {
var tree = this.getData().tree;
var realRoot = tree.root.children[0];
var node = tree.getNodeByDataIndex(dataIndex);
var value = node.getValue();
var name = node.name;
while (node && (node !== realRoot)) {
name = node.parentNode.name + '.' + name;
node = node.parentNode;
}
return encodeHTML(name + ' : ' + value);
},
defaultOption: {
zlevel: 0,
z: 2,
// the position of the whole view
left: '12%',
top: '12%',
right: '12%',
bottom: '12%',
// the layout of the tree, two value can be selected, 'orthogonal' or 'radial'
layout: 'orthogonal',
// the orient of orthoginal layout, can be setted to 'horizontal' or 'vertical'
orient: 'horizontal',
symbol: 'emptyCircle',
symbolSize: 7,
expandAndCollapse: true,
initialTreeDepth: 1,
lineStyle: {
normal: {
color: '#ccc',
width: 1.5,
curveness: 0.5
}
},
itemStyle: {
normal: {
color: 'lightsteelblue',
borderColor: '#c23531',
borderWidth: 1.5
}
},
label: {
normal: {
show: true,
fontSize: 9,
color: '#555'
}
},
leaves: {
label: {
normal: {
show: true
}
}
},
animationEasing: 'linear',
animationDuration: 700,
animationDurationUpdate: 1000
}
});
});
\ No newline at end of file
/**
* @file This file used to draw tree view
*/
define(function (require) {
var graphic = require('../../util/graphic');
var zrUtil = require('zrender/core/util');
var Symbol = require('../helper/Symbol');
var layoutHelper = require('./layoutHelper');
var radialCoordinate = layoutHelper.radialCoordinate;
return require('../../echarts').extendChartView({
type: 'tree',
/**
* Init the chart
* @override
* @param {module:echarts/model/Global} ecModel
* @param {module:echarts/ExtensionAPI} api
*/
init: function (ecModel, api) {
/**
* @private
* @type {module:echarts/data/Tree}
*/
this._oldTree;
/**
* @private
* @type {module:zrender/container/Group}
*/
this._mainGroup = new graphic.Group();
this.group.add(this._mainGroup);
},
render: function (seriesModel, ecModel, api, payload) {
var data = seriesModel.getData();
var layoutInfo = seriesModel.layoutInfo;
var group = this._mainGroup;
var layout = seriesModel.get('layout');
if (layout === 'radial') {
group.attr('position', [layoutInfo.x + layoutInfo.width / 2, layoutInfo.y + layoutInfo.height / 2]);
}
else {
group.attr('position', [layoutInfo.x, layoutInfo.y]);
}
var oldData = this._data;
var seriesScope = {
expandAndCollapse: seriesModel.get('expandAndCollapse'),
layout: layout,
orient: seriesModel.get('orient'),
curvature: seriesModel.get('lineStyle.normal.curveness'),
symbolRotate: seriesModel.get('symbolRotate'),
symbolOffset: seriesModel.get('symbolOffset'),
hoverAnimation: seriesModel.get('hoverAnimation'),
useNameLabel: true,
fadeIn: true
};
data.diff(oldData)
.add(function (newIdx) {
if (symbolNeedsDraw(data, newIdx)) {
// create node and edge
updateNode(data, newIdx, null, group, seriesModel, seriesScope);
}
})
.update(function (newIdx, oldIdx) {
var symbolEl = oldData.getItemGraphicEl(oldIdx);
if (!symbolNeedsDraw(data, newIdx)) {
symbolEl && removeNode(data, newIdx, symbolEl, group, seriesModel, seriesScope);
return;
}
// update node and edge
updateNode(data, newIdx, symbolEl, group, seriesModel, seriesScope);
})
.remove(function (oldIdx) {
var symbolEl = oldData.getItemGraphicEl(oldIdx);
removeNode(data, oldIdx, symbolEl, group, seriesModel, seriesScope);
})
.execute();
if (seriesScope.expandAndCollapse === true) {
data.eachItemGraphicEl(function (el, dataIndex) {
el.off('click').on('click', function () {
api.dispatchAction({
type: 'treeExpandAndCollapse',
seriesId: seriesModel.id,
dataIndex: dataIndex
});
});
});
}
this._data = data;
},
dispose: function () {},
remove: function () {
this._mainGroup.removeAll();
this._data = null;
}
});
function symbolNeedsDraw(data, dataIndex) {
var layout = data.getItemLayout(dataIndex);
return layout
&& !isNaN(layout.x) && !isNaN(layout.y)
&& data.getItemVisual(dataIndex, 'symbol') !== 'none';
}
function getTreeNodeStyle(node, itemModel, seriesScope) {
seriesScope.itemModel = itemModel;
seriesScope.itemStyle = itemModel.getModel('itemStyle.normal').getItemStyle();
seriesScope.hoverItemStyle = itemModel.getModel('itemStyle.emphasis').getItemStyle();
seriesScope.lineStyle = itemModel.getModel('lineStyle.normal').getLineStyle();
seriesScope.labelModel = itemModel.getModel('label.normal');
seriesScope.hoverLabelModel = itemModel.getModel('label.emphasis');
if (node.isExpand === false && node.children.length !== 0) {
seriesScope.symbolInnerColor = seriesScope.itemStyle.fill;
}
else {
seriesScope.symbolInnerColor = '#fff';
}
return seriesScope;
}
function updateNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) {
var isInit = !symbolEl;
var node = data.tree.getNodeByDataIndex(dataIndex);
var itemModel = node.getModel();
var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope);
var virtualRoot = data.tree.root;
var source = node.parentNode === virtualRoot ? node : node.parentNode || node;
var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);
var sourceLayout = source.getLayout();
var sourceOldLayout = sourceSymbolEl
? {
x: sourceSymbolEl.position[0],
y: sourceSymbolEl.position[1],
rawX: sourceSymbolEl.__radialOldRawX,
rawY: sourceSymbolEl.__radialOldRawY
}
: sourceLayout;
var targetLayout = node.getLayout();
if (isInit) {
symbolEl = new Symbol(data, dataIndex, seriesScope);
symbolEl.attr('position', [sourceOldLayout.x, sourceOldLayout.y]);
}
else {
symbolEl.updateData(data, dataIndex, seriesScope);
}
symbolEl.__radialOldRawX = symbolEl.__radialRawX;
symbolEl.__radialOldRawY = symbolEl.__radialRawY;
symbolEl.__radialRawX = targetLayout.rawX;
symbolEl.__radialRawY = targetLayout.rawY;
group.add(symbolEl);
data.setItemGraphicEl(dataIndex, symbolEl);
graphic.updateProps(symbolEl, {
position: [targetLayout.x, targetLayout.y]
}, seriesModel);
var symbolPath = symbolEl.getSymbolPath();
if (seriesScope.layout === 'radial') {
var realRoot = virtualRoot.children[0];
var rootLayout = realRoot.getLayout();
var length = realRoot.children.length;
var rad;
var isLeft;
if (targetLayout.x === rootLayout.x && node.isExpand === true) {
var center = {};
center.x = (realRoot.children[0].getLayout().x + realRoot.children[length - 1].getLayout().x) / 2;
center.y = (realRoot.children[0].getLayout().y + realRoot.children[length - 1].getLayout().y) / 2;
rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x);
if (rad < 0) {
rad = Math.PI * 2 + rad;
}
isLeft = center.x < rootLayout.x;
if (isLeft) {
rad = rad - Math.PI;
}
}
else {
rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x);
if (rad < 0) {
rad = Math.PI * 2 + rad;
}
if (node.children.length === 0 || (node.children.length !== 0 && node.isExpand === false)) {
isLeft = targetLayout.x < rootLayout.x;
if (isLeft) {
rad = rad - Math.PI;
}
}
else {
isLeft = targetLayout.x > rootLayout.x;
if (!isLeft) {
rad = rad - Math.PI;
}
}
}
var textPosition = isLeft ? 'left' : 'right';
symbolPath.setStyle({
textPosition: textPosition,
textRotation: -rad,
textOrigin: 'center',
verticalAlign: 'middle'
});
}
if (node.parentNode && node.parentNode !== virtualRoot) {
var edge = symbolEl.__edge;
if (!edge) {
edge = symbolEl.__edge = new graphic.BezierCurve({
shape: getEdgeShape(seriesScope, sourceOldLayout, sourceOldLayout),
style: zrUtil.defaults({opacity: 0}, seriesScope.lineStyle)
});
}
graphic.updateProps(edge, {
shape: getEdgeShape(seriesScope, sourceLayout, targetLayout),
style: {opacity: 1}
}, seriesModel);
group.add(edge);
}
}
function removeNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) {
var node = data.tree.getNodeByDataIndex(dataIndex);
var virtualRoot = data.tree.root;
var itemModel = node.getModel();
var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope);
var source = node.parentNode === virtualRoot ? node : node.parentNode || node;
var sourceLayout;
while (sourceLayout = source.getLayout(), sourceLayout == null) {
source = source.parentNode === virtualRoot ? source : source.parentNode || source;
}
graphic.updateProps(symbolEl, {
position: [sourceLayout.x + 1, sourceLayout.y + 1]
}, seriesModel, function () {
group.remove(symbolEl);
data.setItemGraphicEl(dataIndex, null);
});
symbolEl.fadeOut(null, {keepLabel: true});
var edge = symbolEl.__edge;
if (edge) {
graphic.updateProps(edge, {
shape: getEdgeShape(seriesScope, sourceLayout, sourceLayout),
style: {
opacity: 0
}
}, seriesModel, function () {
group.remove(edge);
});
}
}
function getEdgeShape(seriesScope, sourceLayout, targetLayout) {
var cpx1;
var cpy1;
var cpx2;
var cpy2;
var orient = seriesScope.orient;
if (seriesScope.layout === 'radial') {
var x1 = sourceLayout.rawX;
var y1 = sourceLayout.rawY;
var x2 = targetLayout.rawX;
var y2 = targetLayout.rawY;
var radialCoor1 = radialCoordinate(x1, y1);
var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * seriesScope.curvature);
var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * seriesScope.curvature);
var radialCoor4 = radialCoordinate(x2, y2);
return {
x1: radialCoor1.x,
y1: radialCoor1.y,
x2: radialCoor4.x,
y2: radialCoor4.y,
cpx1: radialCoor2.x,
cpy1: radialCoor2.y,
cpx2: radialCoor3.x,
cpy2: radialCoor3.y
};
}
else {
var x1 = sourceLayout.x;
var y1 = sourceLayout.y;
var x2 = targetLayout.x;
var y2 = targetLayout.y;
if (orient === 'horizontal') {
cpx1 = x1 + (x2 - x1) * seriesScope.curvature;
cpy1 = y1;
cpx2 = x2 + (x1 - x2) * seriesScope.curvature;
cpy2 = y2;
}
if (orient === 'vertical') {
cpx1 = x1;
cpy1 = y1 + (y2 - y1) * seriesScope.curvature;
cpx2 = x2;
cpy2 = y2 + (y1 - y2) * seriesScope.curvature;
}
return {
x1: x1,
y1: y1,
x2: x2,
y2: y2,
cpx1: cpx1,
cpy1: cpy1,
cpx2: cpx2,
cpy2: cpy2
};
}
}
});
\ No newline at end of file
define(function (require) {
var helper = require('./traversalHelper');
var eachAfter = helper.eachAfter;
var eachBefore = helper.eachBefore;
var layoutHelper = require('./layoutHelper');
var init = layoutHelper.init;
var firstWalk = layoutHelper.firstWalk;
var secondWalk = layoutHelper.secondWalk;
var sep = layoutHelper.separation;
var radialCoordinate = layoutHelper.radialCoordinate;
var getViewRect = layoutHelper.getViewRect;
return function (seriesModel, api) {
var layoutInfo = getViewRect(seriesModel, api);
seriesModel.layoutInfo = layoutInfo;
var layout = seriesModel.get('layout');
var width = 0;
var height = 0;
var separation = null;
if (layout === 'radial') {
width = 2 * Math.PI;
height = Math.min(layoutInfo.height, layoutInfo.width) / 2;
separation = sep(function (node1, node2) {
return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth;
});
}
else {
width = layoutInfo.width;
height = layoutInfo.height;
separation = sep();
}
var virtualRoot = seriesModel.getData().tree.root;
var realRoot = virtualRoot.children[0];
init(virtualRoot);
eachAfter(realRoot, firstWalk, separation);
virtualRoot.hierNode.modifier = - realRoot.hierNode.prelim;
eachBefore(realRoot, secondWalk);
var left = realRoot;
var right = realRoot;
var bottom = realRoot;
eachBefore(realRoot, function (node) {
var x = node.getLayout().x;
if (x < left.getLayout().x) {
left = node;
}
if (x > right.getLayout().x) {
right = node;
}
if (node.depth > bottom.depth) {
bottom = node;
}
});
var delta = left === right ? 1 : separation(left, right) / 2;
var tx = delta - left.getLayout().x;
var kx = 0;
var ky = 0;
var coorX = 0;
var coorY = 0;
if (layout === 'radial') {
kx = width / (right.getLayout().x + delta + tx);
// here we use (node.depth - 1), bucause the real root's depth is 1
ky = height/ ((bottom.depth - 1) || 1);
eachBefore(realRoot, function (node) {
coorX = (node.getLayout().x + tx) * kx;
coorY = (node.depth - 1) * ky;
var finalCoor = radialCoordinate(coorX, coorY);
node.setLayout({x: finalCoor.x, y: finalCoor.y, rawX: coorX, rawY: coorY}, true);
});
}
else {
if (seriesModel.get('orient') === 'horizontal') {
ky = height / (right.getLayout().x + delta + tx);
kx = width / ((bottom.depth - 1) || 1);
eachBefore(realRoot, function (node) {
coorY = (node.getLayout().x + tx) * ky;
coorX = (node.depth - 1) * kx;
node.setLayout({x: coorX, y: coorY}, true);
});
}
else {
kx = width / (right.getLayout().x + delta + tx);
ky = height / ((bottom.depth - 1) || 1);
eachBefore(realRoot, function (node) {
coorX = (node.getLayout().x + tx) * kx;
coorY = (node.depth - 1) * ky;
node.setLayout({x: coorX, y: coorY}, true);
});
}
}
};
});
/**
* @file The layout algorithm of node-link tree diagrams. Here we using Reingold-Tilford algorithm to drawing
* the tree.
* @see https://github.com/d3/d3-hierarchy
*/
define(function (require) {
var layout = require('../../util/layout');
var layoutHelper = {};
/**
* Initialize all computational message for following algorithm
* @param {module:echarts/data/Tree~TreeNode} root The virtual root of the tree
*/
layoutHelper.init = function (root) {
root.hierNode = {
defaultAncestor: null,
ancestor: root,
prelim: 0,
modifier: 0,
change: 0,
shift: 0,
i: 0,
thread: null
};
var nodes = [root];
var node;
var children;
while (node = nodes.pop()) {
children = node.children;
if (node.isExpand && children.length) {
var n = children.length;
for (var i = n - 1; i >= 0; i--) {
var child = children[i];
child.hierNode = {
defaultAncestor: null,
ancestor: child,
prelim: 0,
modifier: 0,
change: 0,
shift: 0,
i: i,
thread: null
};
nodes.push(child);
}
}
}
};
/**
* Computes a preliminary x coordinate for node. Before that, this function is
* applied recursively to the children of node, as well as the function
* apportion(). After spacing out the children by calling executeShifts(), the
* node is placed to the midpoint of its outermost children.
* @param {module:echarts/data/Tree~TreeNode} node
* @param {Function} separation
*/
layoutHelper.firstWalk = function (node, separation) {
var children = node.isExpand ? node.children : [];
var siblings = node.parentNode.children;
var subtreeW = node.hierNode.i ? siblings[node.hierNode.i -1] : null;
if (children.length) {
executeShifts(node);
var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2;
if (subtreeW) {
node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW);
node.hierNode.modifier = node.hierNode.prelim - midPoint;
}
else {
node.hierNode.prelim = midPoint;
}
}
else if (subtreeW) {
node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW);
}
node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation);
};
/**
* Computes all real x-coordinates by summing up the modifiers recursively.
* @param {module:echarts/data/Tree~TreeNode} node
*/
layoutHelper.secondWalk = function (node) {
var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier;
node.setLayout({x: nodeX}, true);
node.hierNode.modifier += node.parentNode.hierNode.modifier;
};
layoutHelper.separation = function (cb) {
return arguments.length ? cb : defaultSeparation;
};
/**
* Transform the common coordinate to radial coordinate
* @param {number} x
* @param {number} y
* @return {Object}
*/
layoutHelper.radialCoordinate = function (x, y) {
var radialCoor = {};
x -= Math.PI / 2;
radialCoor.x = y * Math.cos(x);
radialCoor.y = y * Math.sin(x);
return radialCoor;
};
/**
* Get the layout position of the whole view
* @param {module:echarts/model/Series} seriesModel the model object of sankey series
* @param {module:echarts/ExtensionAPI} api provide the API list that the developer can call
* @return {module:zrender/core/BoundingRect} size of rect to draw the sankey view
*/
layoutHelper.getViewRect = function (seriesModel, api) {
return layout.getLayoutRect(
seriesModel.getBoxLayoutParams(), {
width: api.getWidth(),
height: api.getHeight()
}
);
};
/**
* All other shifts, applied to the smaller subtrees between w- and w+, are
* performed by this function.
* @param {module:echarts/data/Tree~TreeNode} node
*/
function executeShifts(node) {
var children = node.children;
var n = children.length;
var shift = 0;
var change = 0;
while (--n >= 0) {
var child = children[n];
child.hierNode.prelim += shift;
child.hierNode.modifier += shift;
change += child.hierNode.change;
shift += child.hierNode.shift + change;
}
}
/**
* The core of the algorithm. Here, a new subtree is combined with the
* previous subtrees. Threads are used to traverse the inside and outside
* contours of the left and right subtree up to the highest common level.
* Whenever two nodes of the inside contours conflict, we compute the left
* one of the greatest uncommon ancestors using the function nextAncestor()
* and call moveSubtree() to shift the subtree and prepare the shifts of
* smaller subtrees. Finally, we add a new thread (if necessary).
* @param {module:echarts/data/Tree~TreeNode} subtreeV
* @param {module:echarts/data/Tree~TreeNode} subtreeW
* @param {module:echarts/data/Tree~TreeNode} ancestor
* @param {Function} separation
* @return {module:echarts/data/Tree~TreeNode}
*/
function apportion(subtreeV, subtreeW, ancestor, separation) {
if (subtreeW) {
var nodeOutRight = subtreeV;
var nodeInRight = subtreeV;
var nodeOutLeft = nodeInRight.parentNode.children[0];
var nodeInLeft = subtreeW;
var sumOutRight = nodeOutRight.hierNode.modifier;
var sumInRight = nodeInRight.hierNode.modifier;
var sumOutLeft = nodeOutLeft.hierNode.modifier;
var sumInLeft = nodeInLeft.hierNode.modifier;
while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) {
nodeOutRight = nextRight(nodeOutRight);
nodeOutLeft = nextLeft(nodeOutLeft);
nodeOutRight.hierNode.ancestor = subtreeV;
var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim
- sumInRight + separation(nodeInLeft, nodeInRight);
if (shift > 0) {
moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift);
sumInRight += shift;
sumOutRight += shift;
}
sumInLeft += nodeInLeft.hierNode.modifier;
sumInRight += nodeInRight.hierNode.modifier;
sumOutRight += nodeOutRight.hierNode.modifier;
sumOutLeft += nodeOutLeft.hierNode.modifier;
}
if (nodeInLeft && !nextRight(nodeOutRight)) {
nodeOutRight.hierNode.thread = nodeInLeft;
nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight;
}
if (nodeInRight && !nextLeft(nodeOutLeft)) {
nodeOutLeft.hierNode.thread = nodeInRight;
nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft;
ancestor = subtreeV;
}
}
return ancestor;
}
/**
* This function is used to traverse the right contour of a subtree.
* It returns the rightmost child of node or the thread of node. The function
* returns null if and only if node is on the highest depth of its subtree.
* @param {module:echarts/data/Tree~TreeNode} node
* @return {module:echarts/data/Tree~TreeNode}
*/
function nextRight(node) {
var children = node.children;
return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread;
}
/**
* This function is used to traverse the left contour of a subtree (or a subforest).
* It returns the leftmost child of node or the thread of node. The function
* returns null if and only if node is on the highest depth of its subtree.
* @param {module:echarts/data/Tree~TreeNode} node
* @return {module:echarts/data/Tree~TreeNode}
*/
function nextLeft(node) {
var children = node.children;
return children.length && node.isExpand ? children[0] : node.hierNode.thread;
}
/**
* If nodeInLeft’s ancestor is a sibling of node, returns nodeInLeft’s ancestor.
* Otherwise, returns the specified ancestor.
* @param {module:echarts/data/Tree~TreeNode} nodeInLeft
* @param {module:echarts/data/Tree~TreeNode} node
* @param {module:echarts/data/Tree~TreeNode} ancestor
* @return {module:echarts/data/Tree~TreeNode}
*/
function nextAncestor(nodeInLeft, node, ancestor) {
return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode
? nodeInLeft.hierNode.ancestor : ancestor;
}
/**
* Shifts the current subtree rooted at wr. This is done by increasing prelim(w+) and modifier(w+) by shift.
* @param {module:echarts/data/Tree~TreeNode} wl
* @param {module:echarts/data/Tree~TreeNode} wr
* @param {number} shift [description]
*/
function moveSubtree(wl, wr,shift) {
var change = shift / (wr.hierNode.i - wl.hierNode.i);
wr.hierNode.change -= change;
wr.hierNode.shift += shift;
wr.hierNode.modifier += shift;
wr.hierNode.prelim += shift;
wl.hierNode.change += change;
}
function defaultSeparation(node1, node2) {
return node1.parentNode === node2.parentNode ? 1 : 2;
}
return layoutHelper;
});
\ No newline at end of file
define(function (require) {
var commonLayout = require('./commonLayout');
return function (ecModel, api) {
ecModel.eachSeriesByType('tree', function (seriesModel) {
commonLayout(seriesModel, api);
});
};
});
\ No newline at end of file
define(function (require) {
var commonLayout = require('./commonLayout');
return function (ecModel, api) {
ecModel.eachSeriesByType('tree', function (seriesModel) {
commonLayout(seriesModel, api);
});
};
});
\ No newline at end of file
define(function (require) {
var traversalHelper = {
/**
* Traverse the tree from bottom to top and do something
* @param {module:echarts/data/Tree~TreeNode} root The real root of the tree
* @param {Function} callback
*/
eachAfter: function (root, callback, separation) {
var nodes = [root];
var next = [];
var node;
while (node = nodes.pop()) {
next.push(node);
if (node.isExpand) {
var children = node.children;
if (children.length) {
for (var i = 0; i < children.length; i++) {
nodes.push(children[i]);
}
}
}
}
while (node = next.pop()){
callback(node, separation);
}
},
/**
* Traverse the tree from top to bottom and do something
* @param {module:echarts/data/Tree~TreeNode} root The real root of the tree
* @param {Function} callback
*/
eachBefore: function (root, callback) {
var nodes = [root];
var node;
while (node = nodes.pop()) {
callback(node);
if (node.isExpand) {
var children = node.children;
if (children.length) {
for (var i = children.length - 1; i >= 0; i--) {
nodes.push(children[i]);
}
}
}
}
}
};
return traversalHelper;
});
\ No newline at end of file
define(function (require) {
var echarts = require('../../echarts');
echarts.registerAction({
type: 'treeExpandAndCollapse',
event: 'treeExpandAndCollapse',
update: 'update'
}, function (payload, ecModel) {
ecModel.eachComponent({mainType: 'series', subType: 'tree', query: payload}, function (seriesModel) {
var dataIndex = payload.dataIndex;
var tree = seriesModel.getData().tree;
var node = tree.getNodeByDataIndex(dataIndex);
node.isExpand = !node.isExpand;
});
});
});
\ No newline at end of file
......@@ -178,10 +178,14 @@ define(function(require) {
levels = option.levels = setDefault(levels, ecModel);
var treeOption = {};
treeOption.levels = levels;
// Make sure always a new tree is created when setOption,
// in TreemapView, we check whether oldTree === newTree
// to choose mappings approach among old shapes and new shapes.
return Tree.createTree(root, this, levels).data;
return Tree.createTree(root, this, treeOption).data;
},
optionUpdated: function () {
......
......@@ -3,7 +3,7 @@
*
* @module echarts/data/Tree
*/
define(function(require) {
define(function (require) {
var zrUtil = require('zrender/core/util');
var Model = require('../model/Model');
......@@ -230,8 +230,11 @@ define(function(require) {
var hostTree = this.hostTree;
var itemModel = hostTree.data.getItemModel(this.dataIndex);
var levelModel = this.getLevelModel();
return itemModel.getModel(path, (levelModel || hostTree.hostModel).getModel(path));
var leavesModel;
if (!levelModel && (this.children.length === 0 || (this.children.length !== 0 && this.isExpand === false))) {
leavesModel = this.getLeavesModel();
}
return itemModel.getModel(path, (levelModel || leavesModel || hostTree.hostModel).getModel(path));
},
/**
......@@ -241,6 +244,13 @@ define(function(require) {
return (this.hostTree.levelModels || [])[this.depth];
},
/**
* @return {module:echarts/model/Model}
*/
getLeavesModel: function () {
return this.hostTree.leavesModel;
},
/**
* @example
* setItemVisual('color', color);
......@@ -282,8 +292,9 @@ define(function(require) {
* @alias module:echarts/data/Tree
* @param {module:echarts/model/Model} hostModel
* @param {Array.<Object>} levelOptions
* @param {Object} leavesOption
*/
function Tree(hostModel, levelOptions) {
function Tree(hostModel, levelOptions, leavesOption) {
/**
* @type {module:echarts/data/Tree~TreeNode}
* @readOnly
......@@ -318,6 +329,8 @@ define(function(require) {
this.levelModels = zrUtil.map(levelOptions || [], function (levelDefine) {
return new Model(levelDefine, hostModel, hostModel.ecModel);
});
this.leavesModel = new Model(leavesOption || {}, hostModel, hostModel.ecModel);
}
Tree.prototype = {
......@@ -407,12 +420,13 @@ define(function(require) {
* @static
* @param {Object} dataRoot Root node.
* @param {module:echarts/model/Model} hostModel
* @param {Array.<Object>} levelOptions
* @param {Object} treeOptions
* @param {Array.<Object>} treeOptions.levelOptions
* @return module:echarts/data/Tree
*/
Tree.createTree = function (dataRoot, hostModel, levelOptions) {
Tree.createTree = function (dataRoot, hostModel, treeOptions) {
var tree = new Tree(hostModel, levelOptions);
var tree = new Tree(hostModel, treeOptions.levelOptions, treeOptions.leaves);
var listData = [];
var dimMax = 1;
......
......@@ -25,7 +25,7 @@ define(function () {
// PENDING
fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',
// fontFamily: 'Arial, Verdana, sans-serif',
fontSize: 12,
fontSize: 8,
fontStyle: 'normal',
fontWeight: 'normal'
},
......
......@@ -864,7 +864,13 @@ define(function(require) {
}
/**
* Update graphic element properties with or without animation according to the configuration in series
* Update graphic element properties with or without animation according to the
* configuration in series.
*
* Caution: this method will stop previous animation.
* So if do not use this method to one element twice before
* animation starts, unless you know what you are doing.
*
* @param {module:zrender/Element} el
* @param {Object} props
* @param {module:echarts/model/Model} [animatableModel]
......@@ -884,7 +890,13 @@ define(function(require) {
};
/**
* Init graphic element properties with or without animation according to the configuration in series
* Init graphic element properties with or without animation according to the
* configuration in series.
*
* Caution: this method will stop previous animation.
* So if do not use this method to one element twice before
* animation starts, unless you know what you are doing.
*
* @param {module:zrender/Element} el
* @param {Object} props
* @param {module:echarts/model/Model} [animatableModel]
......
......@@ -281,7 +281,7 @@ define(function(require) {
});
// Provide setColor helper method to avoid determine if set the fill or stroke outside
var symbolPathSetColor = function (color) {
var symbolPathSetColor = function (color, innerColor) {
if (this.type !== 'image') {
var symbolStyle = this.style;
var symbolShape = this.shape;
......@@ -290,7 +290,7 @@ define(function(require) {
}
else if (this.__isEmptyBrush) {
symbolStyle.stroke = color;
symbolStyle.fill = '#fff';
symbolStyle.fill = innerColor || '#fff';
}
else {
// FIXME 判断图形默认是填充还是描边,使用 onlyStroke ?
......
此差异已折叠。
id,value
flare,
flare.analytics,
flare.analytics.cluster,
flare.analytics.cluster.AgglomerativeCluster,3938
flare.analytics.cluster.CommunityStructure,3812
flare.analytics.cluster.HierarchicalCluster,6714
flare.analytics.cluster.MergeEdge,743
flare.analytics.graph,
flare.analytics.graph.BetweennessCentrality,3534
flare.analytics.graph.LinkDistance,5731
flare.analytics.graph.MaxFlowMinCut,7840
flare.analytics.graph.ShortestPaths,5914
flare.analytics.graph.SpanningTree,3416
flare.analytics.optimization,
flare.analytics.optimization.AspectRatioBanker,7074
flare.animate,
flare.animate.Easing,17010
flare.animate.FunctionSequence,5842
flare.animate.interpolate,
flare.animate.interpolate.ArrayInterpolator,1983
flare.animate.interpolate.ColorInterpolator,2047
flare.animate.interpolate.DateInterpolator,1375
flare.animate.interpolate.Interpolator,8746
flare.animate.interpolate.MatrixInterpolator,2202
flare.animate.interpolate.NumberInterpolator,1382
flare.animate.interpolate.ObjectInterpolator,1629
flare.animate.interpolate.PointInterpolator,1675
flare.animate.interpolate.RectangleInterpolator,2042
flare.animate.ISchedulable,1041
flare.animate.Parallel,5176
flare.animate.Pause,449
flare.animate.Scheduler,5593
flare.animate.Sequence,5534
flare.animate.Transition,9201
flare.animate.Transitioner,19975
flare.animate.TransitionEvent,1116
flare.animate.Tween,6006
flare.data,
flare.data.converters,
flare.data.converters.Converters,721
flare.data.converters.DelimitedTextConverter,4294
flare.data.converters.GraphMLConverter,9800
flare.data.converters.IDataConverter,1314
flare.data.converters.JSONConverter,2220
flare.data.DataField,1759
flare.data.DataSchema,2165
flare.data.DataSet,586
flare.data.DataSource,3331
flare.data.DataTable,772
flare.data.DataUtil,3322
flare.display,
flare.display.DirtySprite,8833
flare.display.LineSprite,1732
flare.display.RectSprite,3623
flare.display.TextSprite,10066
flare.flex,
flare.flex.FlareVis,4116
flare.physics,
flare.physics.DragForce,1082
flare.physics.GravityForce,1336
flare.physics.IForce,319
flare.physics.NBodyForce,10498
flare.physics.Particle,2822
flare.physics.Simulation,9983
flare.physics.Spring,2213
flare.physics.SpringForce,1681
flare.query,
flare.query.AggregateExpression,1616
flare.query.And,1027
flare.query.Arithmetic,3891
flare.query.Average,891
flare.query.BinaryExpression,2893
flare.query.Comparison,5103
flare.query.CompositeExpression,3677
flare.query.Count,781
flare.query.DateUtil,4141
flare.query.Distinct,933
flare.query.Expression,5130
flare.query.ExpressionIterator,3617
flare.query.Fn,3240
flare.query.If,2732
flare.query.IsA,2039
flare.query.Literal,1214
flare.query.Match,3748
flare.query.Maximum,843
flare.query.methods,
flare.query.methods.add,593
flare.query.methods.and,330
flare.query.methods.average,287
flare.query.methods.count,277
flare.query.methods.distinct,292
flare.query.methods.div,595
flare.query.methods.eq,594
flare.query.methods.fn,460
flare.query.methods.gt,603
flare.query.methods.gte,625
flare.query.methods.iff,748
flare.query.methods.isa,461
flare.query.methods.lt,597
flare.query.methods.lte,619
flare.query.methods.max,283
flare.query.methods.min,283
flare.query.methods.mod,591
flare.query.methods.mul,603
flare.query.methods.neq,599
flare.query.methods.not,386
flare.query.methods.or,323
flare.query.methods.orderby,307
flare.query.methods.range,772
flare.query.methods.select,296
flare.query.methods.stddev,363
flare.query.methods.sub,600
flare.query.methods.sum,280
flare.query.methods.update,307
flare.query.methods.variance,335
flare.query.methods.where,299
flare.query.methods.xor,354
flare.query.methods._,264
flare.query.Minimum,843
flare.query.Not,1554
flare.query.Or,970
flare.query.Query,13896
flare.query.Range,1594
flare.query.StringUtil,4130
flare.query.Sum,791
flare.query.Variable,1124
flare.query.Variance,1876
flare.query.Xor,1101
flare.scale,
flare.scale.IScaleMap,2105
flare.scale.LinearScale,1316
flare.scale.LogScale,3151
flare.scale.OrdinalScale,3770
flare.scale.QuantileScale,2435
flare.scale.QuantitativeScale,4839
flare.scale.RootScale,1756
flare.scale.Scale,4268
flare.scale.ScaleType,1821
flare.scale.TimeScale,5833
flare.util,
flare.util.Arrays,8258
flare.util.Colors,10001
flare.util.Dates,8217
flare.util.Displays,12555
flare.util.Filter,2324
flare.util.Geometry,10993
flare.util.heap,
flare.util.heap.FibonacciHeap,9354
flare.util.heap.HeapNode,1233
flare.util.IEvaluable,335
flare.util.IPredicate,383
flare.util.IValueProxy,874
flare.util.math,
flare.util.math.DenseMatrix,3165
flare.util.math.IMatrix,2815
flare.util.math.SparseMatrix,3366
flare.util.Maths,17705
flare.util.Orientation,1486
flare.util.palette,
flare.util.palette.ColorPalette,6367
flare.util.palette.Palette,1229
flare.util.palette.ShapePalette,2059
flare.util.palette.SizePalette,2291
flare.util.Property,5559
flare.util.Shapes,19118
flare.util.Sort,6887
flare.util.Stats,6557
flare.util.Strings,22026
flare.vis,
flare.vis.axis,
flare.vis.axis.Axes,1302
flare.vis.axis.Axis,24593
flare.vis.axis.AxisGridLine,652
flare.vis.axis.AxisLabel,636
flare.vis.axis.CartesianAxes,6703
flare.vis.controls,
flare.vis.controls.AnchorControl,2138
flare.vis.controls.ClickControl,3824
flare.vis.controls.Control,1353
flare.vis.controls.ControlList,4665
flare.vis.controls.DragControl,2649
flare.vis.controls.ExpandControl,2832
flare.vis.controls.HoverControl,4896
flare.vis.controls.IControl,763
flare.vis.controls.PanZoomControl,5222
flare.vis.controls.SelectionControl,7862
flare.vis.controls.TooltipControl,8435
flare.vis.data,
flare.vis.data.Data,20544
flare.vis.data.DataList,19788
flare.vis.data.DataSprite,10349
flare.vis.data.EdgeSprite,3301
flare.vis.data.NodeSprite,19382
flare.vis.data.render,
flare.vis.data.render.ArrowType,698
flare.vis.data.render.EdgeRenderer,5569
flare.vis.data.render.IRenderer,353
flare.vis.data.render.ShapeRenderer,2247
flare.vis.data.ScaleBinding,11275
flare.vis.data.Tree,7147
flare.vis.data.TreeBuilder,9930
flare.vis.events,
flare.vis.events.DataEvent,2313
flare.vis.events.SelectionEvent,1880
flare.vis.events.TooltipEvent,1701
flare.vis.events.VisualizationEvent,1117
flare.vis.legend,
flare.vis.legend.Legend,20859
flare.vis.legend.LegendItem,4614
flare.vis.legend.LegendRange,10530
flare.vis.operator,
flare.vis.operator.distortion,
flare.vis.operator.distortion.BifocalDistortion,4461
flare.vis.operator.distortion.Distortion,6314
flare.vis.operator.distortion.FisheyeDistortion,3444
flare.vis.operator.encoder,
flare.vis.operator.encoder.ColorEncoder,3179
flare.vis.operator.encoder.Encoder,4060
flare.vis.operator.encoder.PropertyEncoder,4138
flare.vis.operator.encoder.ShapeEncoder,1690
flare.vis.operator.encoder.SizeEncoder,1830
flare.vis.operator.filter,
flare.vis.operator.filter.FisheyeTreeFilter,5219
flare.vis.operator.filter.GraphDistanceFilter,3165
flare.vis.operator.filter.VisibilityFilter,3509
flare.vis.operator.IOperator,1286
flare.vis.operator.label,
flare.vis.operator.label.Labeler,9956
flare.vis.operator.label.RadialLabeler,3899
flare.vis.operator.label.StackedAreaLabeler,3202
flare.vis.operator.layout,
flare.vis.operator.layout.AxisLayout,6725
flare.vis.operator.layout.BundledEdgeRouter,3727
flare.vis.operator.layout.CircleLayout,9317
flare.vis.operator.layout.CirclePackingLayout,12003
flare.vis.operator.layout.DendrogramLayout,4853
flare.vis.operator.layout.ForceDirectedLayout,8411
flare.vis.operator.layout.IcicleTreeLayout,4864
flare.vis.operator.layout.IndentedTreeLayout,3174
flare.vis.operator.layout.Layout,7881
flare.vis.operator.layout.NodeLinkTreeLayout,12870
flare.vis.operator.layout.PieLayout,2728
flare.vis.operator.layout.RadialTreeLayout,12348
flare.vis.operator.layout.RandomLayout,870
flare.vis.operator.layout.StackedAreaLayout,9121
flare.vis.operator.layout.TreeMapLayout,9191
flare.vis.operator.Operator,2490
flare.vis.operator.OperatorList,5248
flare.vis.operator.OperatorSequence,4190
flare.vis.operator.OperatorSwitch,2581
flare.vis.operator.SortOperator,2023
flare.vis.Visualization,16540
\ No newline at end of file
{
"name": "flare",
"children": [
{
"name": "analytics",
"children": [
{
"name": "cluster",
"children": [
{"name": "AgglomerativeCluster", "value": 3938},
{"name": "CommunityStructure", "value": 3812},
{"name": "HierarchicalCluster", "value": 6714},
{"name": "MergeEdge", "value": 743}
]
},
{
"name": "graph",
"children": [
{"name": "BetweennessCentrality", "value": 3534},
{"name": "LinkDistance", "value": 5731},
{"name": "MaxFlowMinCut", "value": 7840},
{"name": "ShortestPaths", "value": 5914},
{"name": "SpanningTree", "value": 3416}
]
},
{
"name": "optimization",
"children": [
{"name": "AspectRatioBanker", "value": 7074}
]
}
]
},
{
"name": "animate",
"children": [
{"name": "Easing", "value": 17010},
{"name": "FunctionSequence", "value": 5842},
{
"name": "interpolate",
"children": [
{"name": "ArrayInterpolator", "value": 1983},
{"name": "ColorInterpolator", "value": 2047},
{"name": "DateInterpolator", "value": 1375},
{"name": "Interpolator", "value": 8746},
{"name": "MatrixInterpolator", "value": 2202},
{"name": "NumberInterpolator", "value": 1382},
{"name": "ObjectInterpolator", "value": 1629},
{"name": "PointInterpolator", "value": 1675},
{"name": "RectangleInterpolator", "value": 2042}
]
},
{"name": "ISchedulable", "value": 1041},
{"name": "Parallel", "value": 5176},
{"name": "Pause", "value": 449},
{"name": "Scheduler", "value": 5593},
{"name": "Sequence", "value": 5534},
{"name": "Transition", "value": 9201},
{"name": "Transitioner", "value": 19975},
{"name": "TransitionEvent", "value": 1116},
{"name": "Tween", "value": 6006}
]
},
{
"name": "data",
"children": [
{
"name": "converters",
"children": [
{"name": "Converters", "value": 721},
{"name": "DelimitedTextConverter", "value": 4294},
{"name": "GraphMLConverter", "value": 9800},
{"name": "IDataConverter", "value": 1314},
{"name": "JSONConverter", "value": 2220}
]
},
{"name": "DataField", "value": 1759},
{"name": "DataSchema", "value": 2165},
{"name": "DataSet", "value": 586},
{"name": "DataSource", "value": 3331},
{"name": "DataTable", "value": 772},
{"name": "DataUtil", "value": 3322}
]
},
{
"name": "display",
"children": [
{"name": "DirtySprite", "value": 8833},
{"name": "LineSprite", "value": 1732},
{"name": "RectSprite", "value": 3623},
{"name": "TextSprite", "value": 10066}
]
},
{
"name": "flex",
"children": [
{"name": "FlareVis", "value": 4116}
]
},
{
"name": "physics",
"children": [
{"name": "DragForce", "value": 1082},
{"name": "GravityForce", "value": 1336},
{"name": "IForce", "value": 319},
{"name": "NBodyForce", "value": 10498},
{"name": "Particle", "value": 2822},
{"name": "Simulation", "value": 9983},
{"name": "Spring", "value": 2213},
{"name": "SpringForce", "value": 1681}
]
},
{
"name": "query",
"children": [
{"name": "AggregateExpression", "value": 1616},
{"name": "And", "value": 1027},
{"name": "Arithmetic", "value": 3891},
{"name": "Average", "value": 891},
{"name": "BinaryExpression", "value": 2893},
{"name": "Comparison", "value": 5103},
{"name": "CompositeExpression", "value": 3677},
{"name": "Count", "value": 781},
{"name": "DateUtil", "value": 4141},
{"name": "Distinct", "value": 933},
{"name": "Expression", "value": 5130},
{"name": "ExpressionIterator", "value": 3617},
{"name": "Fn", "value": 3240},
{"name": "If", "value": 2732},
{"name": "IsA", "value": 2039},
{"name": "Literal", "value": 1214},
{"name": "Match", "value": 3748},
{"name": "Maximum", "value": 843},
{
"name": "methods",
"children": [
{"name": "add", "value": 593},
{"name": "and", "value": 330},
{"name": "average", "value": 287},
{"name": "count", "value": 277},
{"name": "distinct", "value": 292},
{"name": "div", "value": 595},
{"name": "eq", "value": 594},
{"name": "fn", "value": 460},
{"name": "gt", "value": 603},
{"name": "gte", "value": 625},
{"name": "iff", "value": 748},
{"name": "isa", "value": 461},
{"name": "lt", "value": 597},
{"name": "lte", "value": 619},
{"name": "max", "value": 283},
{"name": "min", "value": 283},
{"name": "mod", "value": 591},
{"name": "mul", "value": 603},
{"name": "neq", "value": 599},
{"name": "not", "value": 386},
{"name": "or", "value": 323},
{"name": "orderby", "value": 307},
{"name": "range", "value": 772},
{"name": "select", "value": 296},
{"name": "stddev", "value": 363},
{"name": "sub", "value": 600},
{"name": "sum", "value": 280},
{"name": "update", "value": 307},
{"name": "variance", "value": 335},
{"name": "where", "value": 299},
{"name": "xor", "value": 354},
{"name": "-", "value": 264}
]
},
{"name": "Minimum", "value": 843},
{"name": "Not", "value": 1554},
{"name": "Or", "value": 970},
{"name": "Query", "value": 13896},
{"name": "Range", "value": 1594},
{"name": "StringUtil", "value": 4130},
{"name": "Sum", "value": 791},
{"name": "Variable", "value": 1124},
{"name": "Variance", "value": 1876},
{"name": "Xor", "value": 1101}
]
},
{
"name": "scale",
"children": [
{"name": "IScaleMap", "value": 2105},
{"name": "LinearScale", "value": 1316},
{"name": "LogScale", "value": 3151},
{"name": "OrdinalScale", "value": 3770},
{"name": "QuantileScale", "value": 2435},
{"name": "QuantitativeScale", "value": 4839},
{"name": "RootScale", "value": 1756},
{"name": "Scale", "value": 4268},
{"name": "ScaleType", "value": 1821},
{"name": "TimeScale", "value": 5833}
]
},
{
"name": "util",
"children": [
{"name": "Arrays", "value": 8258},
{"name": "Colors", "value": 10001},
{"name": "Dates", "value": 8217},
{"name": "Displays", "value": 12555},
{"name": "Filter", "value": 2324},
{"name": "Geometry", "value": 10993},
{
"name": "heap",
"children": [
{"name": "FibonacciHeap", "value": 9354},
{"name": "HeapNode", "value": 1233}
]
},
{"name": "IEvaluable", "value": 335},
{"name": "IPredicate", "value": 383},
{"name": "IValueProxy", "value": 874},
{
"name": "math",
"children": [
{"name": "DenseMatrix", "value": 3165},
{"name": "IMatrix", "value": 2815},
{"name": "SparseMatrix", "value": 3366}
]
},
{"name": "Maths", "value": 17705},
{"name": "Orientation", "value": 1486},
{
"name": "palette",
"children": [
{"name": "ColorPalette", "value": 6367},
{"name": "Palette", "value": 1229},
{"name": "ShapePalette", "value": 2059},
{"name": "SizePalette", "value": 2291}
]
},
{"name": "Property", "value": 5559},
{"name": "Shapes", "value": 19118},
{"name": "Sort", "value": 6887},
{"name": "Stats", "value": 6557},
{"name": "Strings", "value": 22026}
]
},
{
"name": "vis",
"children": [
{
"name": "axis",
"children": [
{"name": "Axes", "value": 1302},
{"name": "Axis", "value": 24593},
{"name": "AxisGridLine", "value": 652},
{"name": "AxisLabel", "value": 636},
{"name": "CartesianAxes", "value": 6703}
]
},
{
"name": "controls",
"children": [
{"name": "AnchorControl", "value": 2138},
{"name": "ClickControl", "value": 3824},
{"name": "Control", "value": 1353},
{"name": "ControlList", "value": 4665},
{"name": "DragControl", "value": 2649},
{"name": "ExpandControl", "value": 2832},
{"name": "HoverControl", "value": 4896},
{"name": "IControl", "value": 763},
{"name": "PanZoomControl", "value": 5222},
{"name": "SelectionControl", "value": 7862},
{"name": "TooltipControl", "value": 8435}
]
},
{
"name": "data",
"children": [
{"name": "Data", "value": 20544},
{"name": "DataList", "value": 19788},
{"name": "DataSprite", "value": 10349},
{"name": "EdgeSprite", "value": 3301},
{"name": "NodeSprite", "value": 19382},
{
"name": "render",
"children": [
{"name": "ArrowType", "value": 698},
{"name": "EdgeRenderer", "value": 5569},
{"name": "IRenderer", "value": 353},
{"name": "ShapeRenderer", "value": 2247}
]
},
{"name": "ScaleBinding", "value": 11275},
{"name": "Tree", "value": 7147},
{"name": "TreeBuilder", "value": 9930}
]
},
{
"name": "events",
"children": [
{"name": "DataEvent", "value": 2313},
{"name": "SelectionEvent", "value": 1880},
{"name": "TooltipEvent", "value": 1701},
{"name": "VisualizationEvent", "value": 1117}
]
},
{
"name": "legend",
"children": [
{"name": "Legend", "value": 20859},
{"name": "LegendItem", "value": 4614},
{"name": "LegendRange", "value": 10530}
]
},
{
"name": "operator",
"children": [
{
"name": "distortion",
"children": [
{"name": "BifocalDistortion", "value": 4461},
{"name": "Distortion", "value": 6314},
{"name": "FisheyeDistortion", "value": 3444}
]
},
{
"name": "encoder",
"children": [
{"name": "ColorEncoder", "value": 3179},
{"name": "Encoder", "value": 4060},
{"name": "PropertyEncoder", "value": 4138},
{"name": "ShapeEncoder", "value": 1690},
{"name": "SizeEncoder", "value": 1830}
]
},
{
"name": "filter",
"children": [
{"name": "FisheyeTreeFilter", "value": 5219},
{"name": "GraphDistanceFilter", "value": 3165},
{"name": "VisibilityFilter", "value": 3509}
]
},
{"name": "IOperator", "value": 1286},
{
"name": "label",
"children": [
{"name": "Labeler", "value": 9956},
{"name": "RadialLabeler", "value": 3899},
{"name": "StackedAreaLabeler", "value": 3202}
]
},
{
"name": "layout",
"children": [
{"name": "AxisLayout", "value": 6725},
{"name": "BundledEdgeRouter", "value": 3727},
{"name": "CircleLayout", "value": 9317},
{"name": "CirclePackingLayout", "value": 12003},
{"name": "DendrogramLayout", "value": 4853},
{"name": "ForceDirectedLayout", "value": 8411},
{"name": "IcicleTreeLayout", "value": 4864},
{"name": "IndentedTreeLayout", "value": 3174},
{"name": "Layout", "value": 7881},
{"name": "NodeLinkTreeLayout", "value": 12870},
{"name": "PieLayout", "value": 2728},
{"name": "RadialTreeLayout", "value": 12348},
{"name": "RandomLayout", "value": 870},
{"name": "StackedAreaLayout", "value": 9121},
{"name": "TreeMapLayout", "value": 9191}
]
},
{"name": "Operator", "value": 2490},
{"name": "OperatorList", "value": 5248},
{"name": "OperatorSequence", "value": 4190},
{"name": "OperatorSwitch", "value": 2581},
{"name": "SortOperator", "value": 2023}
]
},
{"name": "Visualization", "value": 16540}
]
}
]
}
{"name":"冰桶挑战","children":[{"name":"刘作虎","children":[{"name":"周鸿祎","children":[{"name":"马化腾"},{"name":"徐小平","children":[{"name":"牛文文","children":[{"name":"姚劲波","children":[{"name":"蔡文胜"},{"name":"蔡明"},{"name":"汪小菲"}]},{"name":"杨守彬","children":[{"name":"所有的创业者"},{"name":"所有的投资人"},{"name":"所有的创业服务机构"}]},{"name":"蒲易"}]},{"name":"罗振宇","children":[{"name":"罗辑思维25000名会员"}]},{"name":"黄西"}]},{"name":"黄章"}]},{"name":"罗永浩"},{"name":"刘江峰","children":[{"name":"何刚","children":[{"name":"谢清江"},{"name":"王翔"},{"name":"艾伟"}]},{"name":"王煜磊"}]}]},{"name":"雷军","children":[{"name":"刘德华","children":[{"name":"朗朗"},{"name":"苏桦伟"},{"name":"周杰伦","children":[{"name":"方文山","children":[{"name":"九把刀"},{"name":"柯有伦"}]},{"name":"五月天","children":[{"name":"谢金燕","children":[{"name":"赵慧仙"},{"name":"张菲","children":[{"name":"小S"}]},{"name":"郭富城"}]},{"name":"张震"},{"name":"金城武"}]}]}]},{"name":"李彦宏","children":[{"name":"俞敏洪"},{"name":"潘石屹","children":[{"name":"任志强"}]},{"name":"田亮","children":[{"name":"王岳伦"},{"name":"小沈阳"},{"name":"李小鹏"}]}]},{"name":"郭台铭","children":[{"name":"孙正义","children":[{"name":"宫坂学"}]},{"name":"谢晓亮"},{"name":"林志玲"}]}]},{"name":"古永锵","children":[{"name":"马云"},{"name":"王长田","children":[{"name":"邓超","children":[{"name":"俞白眉","children":[{"name":"姚晨","children":[{"name":"吴秀波"},{"name":"吴彦祖"},{"name":"孙红雷"}]},{"name":"朱芳雨","children":[{"name":"王仕鹏","children":[{"name":"易建联"}]}]},{"name":"梁超"}]}]},{"name":"刘亦菲"},{"name":"刘同"}]}]},{"name":"朱挺","children":[{"name":"张耀坤","children":[{"name":"姜宁"},{"name":"唐淼"}]},{"name":"周海滨","children":[{"name":"汪嵩","children":[{"name":"蔡贇"},{"name":"李易峰"},{"name":"王弢 "}]},{"name":"邵佳一"},{"name":"高迪","children":[{"name":"莫雷诺"},{"name":"恩里克"},{"name":"保罗"}]}]},{"name":"阎小闯"}]},{"name":"郑璐","children":[{"name":"于嘉","children":[{"name":"董成鹏","children":[{"name":"伊一","children":[{"name":"许嵩"},{"name":"付辛博"},{"name":"洪辰"}]},{"name":"王祖蓝","children":[{"name":"王菀之"},{"name":"李亚男","children":[{"name":"宋熙年"},{"name":"钟嘉欣"},{"name":"陈美诗"}]},{"name":"贾玲"}]},{"name":"白客","children":[{"name":"盛宇","children":[{"name":"邪童 "},{"name":"杜海涛"},{"name":"汪涵"}]},{"name":"派克特"},{"name":"谢帝","children":[{"name":"C-BLOCK小胖"},{"name":"范元成"},{"name":"隋凯","children":[{"name":"高以翔"},{"name":"马楚成"}]}]}]}]},{"name":"易建联、李艾、江映蓉"}]},{"name":"Kevin Han"}]},{"name":"舒德伟","children":[{"name":"姚明"},{"name":"NBA中国全体员工"}]},{"name":"叶丙成","children":[{"name":"翟本乔"},{"name":"嵇晓华","children":[{"name":"王思聪","children":[{"name":"易振兴","children":[{"name":"徐磊"},{"name":"佟大为","children":[{"name":"孟非","children":[{"name":"郭德纲","children":[{"name":"于谦"}]},{"name":"黄健翔","children":[{"name":"张琳芃","children":[{"name":"黄博文"},{"name":"李帅"}]},{"name":"郜林","children":[{"name":"刘建宏"},{"name":"李玮峰"}]}]}]},{"name":"陈坤"},{"name":"AKB48"}]},{"name":"吴欣鸿","children":[{"name":"贾乃亮"},{"name":"李小璐"},{"name":"angelababy"}]}]},{"name":"林更新","children":[{"name":"赵又廷"},{"name":"佟丽娅"},{"name":"AngelaBaby"}]},{"name":"刘军"}]},{"name":"魏坤琳","children":[{"name":"迟毓凯"},{"name":"李淼"},{"name":"姜振宇"}]},{"name":"刘成城","children":[{"name":"张颖"},{"name":"王自如","children":[{"name":"刘翔"},{"name":"吴海"},{"name":"傅盛"}]},{"name":"汪峰"}]}]}]},{"name":"萧上农","children":[{"name":"林之晨","children":[{"name":"柯文哲","children":[{"name":"赵少康"},{"name":"魏德圣"},{"name":"郭子乾"}]},{"name":"连胜文","children":[{"name":"郝龙斌","children":[{"name":"卢贝松"},{"name":"胡志强"},{"name":"邱文达"}]},{"name":"朱立伦"},{"name":"吴思华"}]},{"name":"管中闵","children":[{"name":"杜紫军"},{"name":"陈保基"},{"name":"杨泮池"}]}]},{"name":"陈素兰","children":[{"name":"颜漏有","children":[{"name":"詹宏志","children":[{"name":"钮承泽"},{"name":"李宗盛"},{"name":"何飞鹏"}]},{"name":"陈清祥","children":[{"name":"黄日灿"},{"name":"黄胜华"},{"name":"吴升奇"}]}]}]},{"name":"蔡牧民"}]},{"name":"林书豪","children":[{"name":"兰德里-菲尔兹"},{"name":"帕森斯"}]},{"name":"王猛","children":[{"name":"杨毅"},{"name":"柯凡"},{"name":"StephonMarbury"}]},{"name":"叶璇","children":[{"name":"李晨"},{"name":"苏芒","children":[{"name":"黄晓明","children":[{"name":"范冰冰"},{"name":"李冰冰","children":[{"name":"王中军"},{"name":"新浪娱乐"}]}]}]},{"name":"陈欧"}]},{"name":"章子怡","children":[{"name":"TFBoys","children":[{"name":"尚格云顿"}]},{"name":"韩庚","children":[{"name":"迈克尔·贝"},{"name":"何炅"},{"name":"那英"}]},{"name":"苏菲玛索"}]},{"name":"张靓颖","children":[{"name":"张杰","children":[{"name":"快乐家族"},{"name":"李宇春"},{"name":"萧敬腾"}]},{"name":"王铮亮","children":[{"name":"天天兄弟"},{"name":"武艺","children":[{"name":"卓文萱","children":[{"name":"廖俊杰","children":[{"name":"连晨翔","children":[{"name":"马振桓"},{"name":"萧煌奇"},{"name":"诗安"}]}]}]},{"name":"阿纬"},{"name":"洪卓立"}]},{"name":"DJ小强"}]},{"name":"Timbaland"}]},{"name":"邓紫棋","children":[{"name":"李蕴","children":[{"name":"何超莲","children":[{"name":"吴克群","children":[{"name":" 何猷啟"},{"name":"陈泽杉"}]},{"name":"卡提娜"},{"name":"jw_amusic "}]},{"name":"诗雅"},{"name":"陈静"}]},{"name":"蔡卓妍","children":[{"name":"钟欣桐","children":[{"name":"乔振宇","children":[{"name":"马天宇"},{"name":"陈伟霆","children":[{"name":"霍汶希"}]},{"name":"高伟光"}]},{"name":" 周汤豪"},{"name":"黃鴻升"}]},{"name":"谢娜"},{"name":"詹瑞文"}]},{"name":"茜拉","children":[{"name":"EXO-M"},{"name":"巫启贤"}]}]},{"name":"卫诗雅","children":[{"name":"吴君如"},{"name":"邹凯光"},{"name":"钟舒漫"}]},{"name":"容祖儿","children":[{"name":"梁家辉"},{"name":"黄伟文"}]},{"name":"蔡一智","children":[{"name":"陈奕迅","children":[{"name":"谢霆锋","children":[{"name":"桂纶镁","children":[{"name":"舒淇"},{"name":"张惠妹"},{"name":"孙燕姿"}]},{"name":"林丹"},{"name":"李云迪"}]},{"name":"范晓萱"},{"name":"张一白","children":[{"name":"彭于晏","children":[{"name":"林超贤"}]},{"name":"魏晨","children":[{"name":"秦凯","children":[{"name":"孙杨","children":[{"name":"张学友"},{"name":"华少"}]},{"name":"吴敏霞"},{"name":"陈一冰"}]}]},{"name":"张嘉佳"}]}]},{"name":"葛民辉"},{"name":"郑伊健","children":[{"name":"陈小春"},{"name":"谢天华"}]}]},{"name":"林俊杰","children":[{"name":"王力宏"},{"name":"蔡依林"}]},{"name":"徐峥","children":[{"name":"李连杰"},{"name":"韩寒"},{"name":"赵薇"}]},{"name":"刘循子墨","children":[{"name":"薛之谦"},{"name":"杨姗姗"}]},{"name":"王自健","children":[{"name":"郑凯"},{"name":"刘江"},{"name":"刘涛"}]},{"name":"罗震环","children":[{"name":"邹凯","children":[{"name":"许嵩 "},{"name":"张成龙"},{"name":"邹市明 "}]},{"name":"林琪雪","children":[{"name":"禹景曦","children":[{"name":"张翔玲","children":[{"name":"PLU小米"},{"name":"高地平"}]},{"name":"戴士","children":[{"name":"杨丰智"},{"name":"李鑫"},{"name":"卢本伟","children":[{"name":"孙亚龙"},{"name":"瞿申图"},{"name":"朱永权"}]}]},{"name":"裴乐","children":[{"name":"沈伟荣","children":[{"name":"金亦波"},{"name":"卞正伟"}]},{"name":"李君"}]}]},{"name":"孔连顺","children":[{"name":"老湿","children":[{"name":"至尊玉"},{"name":"马俊"},{"name":"颜土豆avi"}]},{"name":"小爱"},{"name":"马诗歌","children":[{"name":"张本煜"}]}]},{"name":"孙博文","children":[{"name":"陈剑书"},{"name":"陈琦栋"},{"name":"滕林季"}]}]},{"name":"沈建宏","children":[{"name":"陈奕","children":[{"name":"炎亚纶"},{"name":"张榕容"},{"name":"刘希平"}]},{"name":"何润东","children":[{"name":"俞永福","children":[{"name":"曹国伟"},{"name":"余承东"},{"name":"金池","children":[{"name":"曹格"},{"name":"魏雪漫"},{"name":"曾一鸣 "}]}]},{"name":"郭品超"},{"name":"霍建华 "}]},{"name":"张根硕"}]}]},{"name":"涂松岩","children":[{"name":"海清"},{"name":"张韵艺"},{"name":"王媛可"}]},{"name":"陈嘉上","children":[{"name":"包贝尔","children":[{"name":"陈赫"},{"name":"杨子姗"}]}]},{"name":"留几手","children":[{"name":"夏河"},{"name":"陆琪","children":[{"name":"贝志诚"},{"name":"孙杰"}]},{"name":"张辛苑","children":[{"name":"黄轩"},{"name":"古川雄辉"},{"name":"蒋劲夫"}]}]},{"name":"郑希怡","children":[{"name":"古巨基","children":[{"name":"崔始源","children":[{"name":"朴正洙"},{"name":"金希澈"}]},{"name":"黄子华"}]}]},{"name":"宁浩","children":[{"name":"徐铮"},{"name":"黄渤"},{"name":"雷佳音"}]},{"name":"鈕承澤","children":[{"name":"陈意涵","children":[{"name":"张钧甯"},{"name":"陈柏霖","children":[{"name":"冯绍峰"},{"name":"高华阳","children":[{"name":"王志鹏"},{"name":"李东霖"},{"name":"夏青"}]}]},{"name":"池珍熙"}]},{"name":"阮经天"}]},{"name":"周显扬","children":[{"name":"王珞丹"},{"name":"井柏然"},{"name":"张晋"}]},{"name":"徐熙娣","children":[{"name":"蔡康永"}]},{"name":"刘俊纬","children":[{"name":"杨奇煜","children":[{"name":"曾志伟"},{"name":"张艾亚","children":[{"name":"房思瑜"}]}]},{"name":"林峰"}]},{"name":"周汤豪","children":[{"name":"庄濠全","children":[{"name":"罗志祥"},{"name":"簡愷樂"}]},{"name":"林暐恒"},{"name":"王雪娥","children":[{"name":"洪炜宁"}]}]},{"name":"杨颖","children":[{"name":"倪妮"}]},{"name":"董子健","children":[{"name":"郭京飞","children":[{"name":"袁咏仪"},{"name":"钱芳"}]},{"name":"陆毅"},{"name":"关锦鹏"}]}]}
\ No newline at end of file
{
"name": "flare",
"children": [
{
"name": "data",
"children": [
{
"name": "converters",
"children": [
{"name": "Converters", "value": 721},
{"name": "DelimitedTextConverter", "value": 4294}
]
},
{
"name": "DataUtil",
"value": 3322
}
]
},
{
"name": "display",
"children": [
{"name": "DirtySprite", "value": 8833},
{"name": "LineSprite", "value": 1732},
{"name": "RectSprite", "value": 3623}
]
},
{
"name": "flex",
"children": [
{"name": "FlareVis", "value": 4116}
]
},
{
"name": "query",
"children": [
{"name": "AggregateExpression", "value": 1616},
{"name": "And", "value": 1027},
{"name": "Arithmetic", "value": 3891},
{"name": "Average", "value": 891},
{"name": "BinaryExpression", "value": 2893},
{"name": "Comparison", "value": 5103},
{"name": "CompositeExpression", "value": 3677},
{"name": "Count", "value": 781},
{"name": "DateUtil", "value": 4141},
{"name": "Distinct", "value": 933},
{"name": "Expression", "value": 5130},
{"name": "ExpressionIterator", "value": 3617},
{"name": "Fn", "value": 3240},
{"name": "If", "value": 2732},
{"name": "IsA", "value": 2039},
{"name": "Literal", "value": 1214},
{"name": "Match", "value": 3748},
{"name": "Maximum", "value": 843},
{
"name": "methods",
"children": [
{"name": "add", "value": 593},
{"name": "and", "value": 330},
{"name": "average", "value": 287},
{"name": "count", "value": 277},
{"name": "distinct", "value": 292},
{"name": "div", "value": 595},
{"name": "eq", "value": 594},
{"name": "fn", "value": 460},
{"name": "gt", "value": 603},
{"name": "gte", "value": 625},
{"name": "iff", "value": 748},
{"name": "isa", "value": 461},
{"name": "lt", "value": 597},
{"name": "lte", "value": 619},
{"name": "max", "value": 283},
{"name": "min", "value": 283},
{"name": "mod", "value": 591},
{"name": "mul", "value": 603},
{"name": "neq", "value": 599},
{"name": "not", "value": 386},
{"name": "or", "value": 323},
{"name": "orderby", "value": 307},
{"name": "range", "value": 772},
{"name": "select", "value": 296},
{"name": "stddev", "value": 363},
{"name": "sub", "value": 600},
{"name": "sum", "value": 280},
{"name": "update", "value": 307},
{"name": "variance", "value": 335},
{"name": "where", "value": 299},
{"name": "xor", "value": 354},
{"name": "_", "value": 264}
]
},
{"name": "Minimum", "value": 843},
{"name": "Not", "value": 1554},
{"name": "Or", "value": 970},
{"name": "Query", "value": 13896},
{"name": "Range", "value": 1594},
{"name": "StringUtil", "value": 4130},
{"name": "Sum", "value": 791},
{"name": "Variable", "value": 1124},
{"name": "Variance", "value": 1876},
{"name": "Xor", "value": 1101}
]
},
{
"name": "scale",
"children": [
{"name": "IScaleMap", "value": 2105},
{"name": "LinearScale", "value": 1316},
{"name": "LogScale", "value": 3151},
{"name": "OrdinalScale", "value": 3770},
{"name": "QuantileScale", "value": 2435},
{"name": "QuantitativeScale", "value": 4839},
{"name": "RootScale", "value": 1756},
{"name": "Scale", "value": 4268},
{"name": "ScaleType", "value": 1821},
{"name": "TimeScale", "value": 5833}
]
}
]
}
\ No newline at end of file
{
"name": "flare",
"children": [
{
"name": "data",
"children": [
{
"name": "converters",
"children": [
{"name": "DelimitedTextConverter", "value": 4294}
]
}
]
},
{
"name": "display",
"children": [
{"name": "DirtySprite", "value": 8833}
]
}
]
}
\ No newline at end of file
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="esl.js"></script>
<script src="config.js"></script>
<script src="lib/jquery.min.js"></script>
</head>
<body>
<style>
html, body, #main {
width: 100%;
padding: 0;
margin: 0;
height: 100%;
}
</style>
<div id="main"></div>
<script>
require([
'echarts',
'echarts/chart/tree',
'echarts/component/tooltip'
], function (echarts) {
var chart = echarts.init(document.getElementById('main'), null, {
renderer: 'canvas'
});
window.onresize = function () {
chart.resize();
};
$.getJSON('./data/ec-option-doc-statistics-201604.json')
.done(function (rawData) {
function convert(source, target, basePath) {
for (var key in source) {
var path = key;
if (key.match(/^\$/)) {
}
else {
target.children = target.children || [];
var child = {
name: path
};
target.children.push(child);
convert(source[key], child, path);
}
}
if (!target.children) {
target.value = source.$count || 1;
}
}
var data = {name: 'option'};
convert(rawData, data, '');
chart.setOption({
tooltip: {
trigger: 'item',
triggerOn: 'mousemove'
},
series:[
{
type: 'tree',
data: [data],
top: '2%',
left: '7%',
bottom: '2%',
right: '20%',
symbolSize: 7,
initialTreeDepth: 1,
label: {
normal: {
position: 'left',
verticalAlign: 'middle',
align: 'right'
}
},
leaves: {
label: {
normal: {
position: 'right',
verticalAlign: 'middle',
align: 'left'
}
}
},
expandAndCollapse: true,
animationDuration: 550,
animationDurationUpdate: 750
}
]
});
});
});
</script>
</body>
</html>
\ No newline at end of file
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="esl.js"></script>
<script src="config.js"></script>
<script src="lib/jquery.min.js"></script>
</head>
<body>
<style>
html, body, #main {
width: 100%;
padding: 0;
margin: 0;
height: 100%;
}
</style>
<div id="main"></div>
<script>
require([
'echarts',
'echarts/chart/tree',
'echarts/component/tooltip',
'echarts/component/legend'
], function (echarts) {
var chart = echarts.init(document.getElementById('main'), null, {
renderer: 'canvas'
});
window.onresize = function () {
chart.resize();
};
var data1 = {
"name": "flare",
"children": [
{
"name": "data",
"children": [
{
"name": "converters",
"children": [
{"name": "Converters", "value": 721},
{"name": "DelimitedTextConverter", "value": 4294}
]
},
{
"name": "DataUtil",
"value": 3322
}
]
},
{
"name": "display",
"children": [
{"name": "DirtySprite", "value": 8833},
{"name": "LineSprite", "value": 1732},
{"name": "RectSprite", "value": 3623}
]
},
{
"name": "flex",
"children": [
{"name": "FlareVis", "value": 4116}
]
},
{
"name": "query",
"children": [
{"name": "AggregateExpression", "value": 1616},
{"name": "And", "value": 1027},
{"name": "Arithmetic", "value": 3891},
{"name": "Average", "value": 891},
{"name": "BinaryExpression", "value": 2893},
{"name": "Comparison", "value": 5103},
{"name": "CompositeExpression", "value": 3677},
{"name": "Count", "value": 781},
{"name": "DateUtil", "value": 4141},
{"name": "Distinct", "value": 933},
{"name": "Expression", "value": 5130},
{"name": "ExpressionIterator", "value": 3617},
{"name": "Fn", "value": 3240},
{"name": "If", "value": 2732},
{"name": "IsA", "value": 2039},
{"name": "Literal", "value": 1214},
{"name": "Match", "value": 3748},
{"name": "Maximum", "value": 843},
{
"name": "methods",
"children": [
{"name": "add", "value": 593},
{"name": "and", "value": 330},
{"name": "average", "value": 287},
{"name": "count", "value": 277},
{"name": "distinct", "value": 292},
{"name": "div", "value": 595},
{"name": "eq", "value": 594},
{"name": "fn", "value": 460},
{"name": "gt", "value": 603},
{"name": "gte", "value": 625},
{"name": "iff", "value": 748},
{"name": "isa", "value": 461},
{"name": "lt", "value": 597},
{"name": "lte", "value": 619},
{"name": "max", "value": 283},
{"name": "min", "value": 283},
{"name": "mod", "value": 591},
{"name": "mul", "value": 603},
{"name": "neq", "value": 599},
{"name": "not", "value": 386},
{"name": "or", "value": 323},
{"name": "orderby", "value": 307},
{"name": "range", "value": 772},
{"name": "select", "value": 296},
{"name": "stddev", "value": 363},
{"name": "sub", "value": 600},
{"name": "sum", "value": 280},
{"name": "update", "value": 307},
{"name": "variance", "value": 335},
{"name": "where", "value": 299},
{"name": "xor", "value": 354},
{"name": "_", "value": 264}
]
},
{"name": "Minimum", "value": 843},
{"name": "Not", "value": 1554},
{"name": "Or", "value": 970},
{"name": "Query", "value": 13896},
{"name": "Range", "value": 1594},
{"name": "StringUtil", "value": 4130},
{"name": "Sum", "value": 791},
{"name": "Variable", "value": 1124},
{"name": "Variance", "value": 1876},
{"name": "Xor", "value": 1101}
]
},
{
"name": "scale",
"children": [
{"name": "IScaleMap", "value": 2105},
{"name": "LinearScale", "value": 1316},
{"name": "LogScale", "value": 3151},
{"name": "OrdinalScale", "value": 3770},
{"name": "QuantileScale", "value": 2435},
{"name": "QuantitativeScale", "value": 4839},
{"name": "RootScale", "value": 1756},
{"name": "Scale", "value": 4268},
{"name": "ScaleType", "value": 1821},
{"name": "TimeScale", "value": 5833}
]
}
]
};
var data2 = {
"name": "flare",
"children": [
{
"name": "data",
"children": [
{
"name": "converters",
"children": [
{"name": "DelimitedTextConverter", "value": 4294}
]
}
]
},
{
"name": "display",
"children": [
{"name": "DirtySprite", "value": 8833}
]
}
]
};
chart.setOption({
tooltip: {
trigger: 'item',
triggerOn: 'mousemove'
},
legend: {
top: '2%',
left: '3%',
orient: 'vertical',
data: [{
name: 'tree1',
icon: 'rectangle'
} ,
{
name: 'tree2',
icon: 'rectangle'
}],
borderColor: '#c23531'
},
series:[
{
type: 'tree',
name: 'tree1',
data: [data1],
top: '5%',
left: '7%',
bottom: '2%',
right: '60%',
symbolSize: 7,
initialTreeDepth: 2,
label: {
normal: {
position: 'left',
verticalAlign: 'middle',
align: 'right'
}
},
leaves: {
label: {
normal: {
position: 'right',
verticalAlign: 'middle',
align: 'left'
}
}
},
expandAndCollapse: true,
animationDuration: 550,
animationDurationUpdate: 750
},
{
type: 'tree',
name: 'tree2',
data: [data2],
top: '5%',
left: '60%',
bottom: '2%',
right: '20%',
symbolSize: 7,
initialTreeDepth: 1,
label: {
normal: {
position: 'left',
verticalAlign: 'middle',
align: 'right'
}
},
leaves: {
label: {
normal: {
position: 'right',
verticalAlign: 'middle',
align: 'left'
}
}
},
expandAndCollapse: true,
animationDuration: 550,
animationDurationUpdate: 750
}
]
});
});
</script>
</body>
</html>
\ No newline at end of file
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="esl.js"></script>
<script src="config.js"></script>
<script src="lib/jquery.min.js"></script>
</head>
<body>
<style>
html, body, #main {
width: 100%;
padding: 0;
margin: 0;
height: 100%;
}
</style>
<div id="main"></div>
<script>
require([
'echarts',
'echarts/chart/tree',
'echarts/component/tooltip'
], function (echarts) {
var chart = echarts.init(document.getElementById('main'), null, {
renderer: 'canvas'
});
window.onresize = function () {
chart.resize();
};
$.getJSON('./data/flare.json')
.done(function (data) {
chart.setOption({
tooltip: {
trigger: 'item',
triggerOn: 'mousemove'
},
series:[
{
type: 'tree',
data: [data],
top: '18%',
bottom: '14%',
layout: 'radial',
symbol: 'emptyCircle',
symbolSize: 7,
initialTreeDepth: 3,
animationDurationUpdate: 750
}
]
});
});
});
</script>
</body>
</html>
\ No newline at end of file
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="esl.js"></script>
<script src="config.js"></script>
<script src="lib/jquery.min.js"></script>
</head>
<body>
<style>
html, body, #main {
width: 100%;
padding: 0;
margin: 0;
height: 100%;
}
</style>
<div id="main"></div>
<script>
require([
'echarts',
'echarts/chart/tree',
'echarts/component/tooltip'
], function (echarts) {
var chart = echarts.init(document.getElementById('main'), null, {
renderer: 'canvas'
});
window.onresize = function () {
chart.resize();
};
$.getJSON('./data/flare.json')
.done(function (data) {
chart.setOption({
tooltip: {
trigger: 'item',
triggerOn: 'mousemove'
},
series:[
{
type: 'tree',
data: [data],
left: '2%',
right: '2%',
top: '8%',
bottom: '20%',
symbol: 'emptyCircle',
orient: 'vertical',
expandAndCollapse: true,
initialTreeDepth: 2,
label: {
normal: {
position: 'top',
rotate: -90,
verticalAlign: 'middle',
align: 'right'
}
},
leaves: {
label: {
normal: {
position: 'bottom',
rotate: -90,
verticalAlign: 'middle',
align: 'left'
}
}
},
animationDurationUpdate: 750
}
]
});
});
});
</script>
</body>
</html>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册