提交 6a50ca47 编写于 作者: O Ovilia

feat(sunburst): improve sorting

上级 fc13cbf8
...@@ -295,7 +295,8 @@ function getNodeColor(node, seriesModel, ecModel) { ...@@ -295,7 +295,8 @@ function getNodeColor(node, seriesModel, ecModel) {
var color = node.getModel('itemStyle.normal').get('color'); var color = node.getModel('itemStyle.normal').get('color');
if (!color) { if (!color) {
// First-generation color // First-generation color
color = ecModel.option.color[getRootId(node)]; var length = ecModel.option.color.length;
color = ecModel.option.color[getRootId(node) % length];
} }
return color; return color;
......
...@@ -76,6 +76,8 @@ export default SeriesModel.extend({ ...@@ -76,6 +76,8 @@ export default SeriesModel.extend({
// 'zoomToNode', 'link', or false // 'zoomToNode', 'link', or false
nodeClick: 'zoomToNode', nodeClick: 'zoomToNode',
renderLabelForZeroData: false,
label: { label: {
normal: { normal: {
// could be: 'radial', 'tangential', or 'none' // could be: 'radial', 'tangential', or 'none'
...@@ -114,9 +116,18 @@ export default SeriesModel.extend({ ...@@ -114,9 +116,18 @@ export default SeriesModel.extend({
levels: [], levels: [],
// null for not sorting, /**
// 'desc' and 'asc' for descend and ascendant order * Sort order.
sortOrder: 'desc' *
* Valid values: 'desc', 'asc', null, or callback function.
* 'desc' and 'asc' for descend and ascendant order;
* null for not sorting;
* example of callback function:
* function(nodeA, nodeB) {
* return nodeA.getValue() - nodeB.getValue();
* }
*/
sort: 'desc'
}, },
getViewRoot: function () { getViewRoot: function () {
......
...@@ -31,6 +31,8 @@ var SunburstView = ChartView.extend({ ...@@ -31,6 +31,8 @@ var SunburstView = ChartView.extend({
var group = this.group; var group = this.group;
var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData');
dualTravel( dualTravel(
newRoot ? [newRoot] : [], newRoot ? [newRoot] : [],
oldRoot ? [oldRoot] : [] oldRoot ? [oldRoot] : []
...@@ -71,6 +73,11 @@ var SunburstView = ChartView.extend({ ...@@ -71,6 +73,11 @@ var SunburstView = ChartView.extend({
} }
function doRenderNode(newNode, oldNode) { function doRenderNode(newNode, oldNode) {
if (!renderLabelForZeroData && newNode && !newNode.getValue()) {
// Not render data with value 0
newNode = null;
}
if (newNode !== virtualRoot) { if (newNode !== virtualRoot) {
if (oldNode && oldNode.piece) { if (oldNode && oldNode.piece) {
if (newNode) { if (newNode) {
......
...@@ -25,8 +25,6 @@ export default function (seriesType, ecModel, api, payload) { ...@@ -25,8 +25,6 @@ export default function (seriesType, ecModel, api, payload) {
var r0 = parsePercent(radius[0], size / 2); var r0 = parsePercent(radius[0], size / 2);
var r = parsePercent(radius[1], size / 2); var r = parsePercent(radius[1], size / 2);
// var data = seriesModel.getData();
var startAngle = -seriesModel.get('startAngle') * RADIAN; var startAngle = -seriesModel.get('startAngle') * RADIAN;
var minAngle = seriesModel.get('minAngle') * RADIAN; var minAngle = seriesModel.get('minAngle') * RADIAN;
...@@ -34,9 +32,9 @@ export default function (seriesType, ecModel, api, payload) { ...@@ -34,9 +32,9 @@ export default function (seriesType, ecModel, api, payload) {
var treeRoot = seriesModel.getViewRoot(); var treeRoot = seriesModel.getViewRoot();
var rootDepth = treeRoot.depth; var rootDepth = treeRoot.depth;
var sortOrder = seriesModel.get('sortOrder'); var sort = seriesModel.get('sort');
if (sortOrder != null) { if (sort != null) {
initChildren(treeRoot, sortOrder === 'asc'); initChildren(treeRoot, sort);
} }
var validDataCount = 0; var validDataCount = 0;
...@@ -49,7 +47,7 @@ export default function (seriesType, ecModel, api, payload) { ...@@ -49,7 +47,7 @@ export default function (seriesType, ecModel, api, payload) {
var unitRadian = Math.PI / (sum || validDataCount) * 2; var unitRadian = Math.PI / (sum || validDataCount) * 2;
var renderRollupNode = treeRoot !== virtualRoot; var renderRollupNode = treeRoot !== virtualRoot;
var levels = treeRoot.height + (renderRollupNode ? 1 : 0); var levels = treeRoot.height - (renderRollupNode ? 0 : 1);
var rPerLevel = (r - r0) / (levels || 1); var rPerLevel = (r - r0) / (levels || 1);
var clockwise = seriesModel.get('clockwise'); var clockwise = seriesModel.get('clockwise');
...@@ -90,7 +88,7 @@ export default function (seriesType, ecModel, api, payload) { ...@@ -90,7 +88,7 @@ export default function (seriesType, ecModel, api, payload) {
endAngle = startAngle + dir * angle; endAngle = startAngle + dir * angle;
var depth = node.depth - rootDepth + (renderRollupNode ? 1 : 0); var depth = node.depth - rootDepth - (renderRollupNode ? 0 : 1);
var rStart = r0 + rPerLevel * depth; var rStart = r0 + rPerLevel * depth;
var rEnd = r0 + rPerLevel * (depth + 1); var rEnd = r0 + rPerLevel * (depth + 1);
...@@ -170,14 +168,21 @@ function initChildren(node, isAsc) { ...@@ -170,14 +168,21 @@ function initChildren(node, isAsc) {
/** /**
* Sort children nodes * Sort children nodes
* *
* @param {TreeNode[]} children children of node to be sorted * @param {TreeNode[]} children children of node to be sorted
* @param {boolean} isAsc if is in ascendant order * @param {string | function | null} sort sort method
* See SunburstSeries.js for details.
*/ */
function sort(children, isAsc) { function sort(children, sortOrder) {
return children.sort(function (a, b) { if (typeof sortOrder === 'function') {
var diff = (a.getValue() - b.getValue()) * (isAsc ? -1 : 1); return children.sort(sortOrder);
return diff === 0 }
? (a.dataIndex - b.dataIndex) * (isAsc ? 1 : -1) else {
: diff; var isAsc = sortOrder === 'asc';
}); return children.sort(function (a, b) {
var diff = (a.getValue() - b.getValue()) * (isAsc ? 1 : -1);
return diff === 0
? (a.dataIndex - b.dataIndex) * (isAsc ? -1 : 1)
: diff;
});
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册