blob: a8be9d619ef5dd1357f815b8b9ec6238e7b907de [file] [log] [blame]
/*
title: Combine-Separate Morphing
category: custom
titleCN: 聚合分割形变
difficulty: 11
*/
var PIE_COLORS = [
'#e06343',
'#37a354',
'#b55dba',
'#b5bd48',
'#8378EA',
'#96BFFF'
];
var CLUSTER_COLORS = [
'#cc5664',
'#9bd6ec',
'#ea946e',
'#8acaaa',
'#f1ec64',
'#ee8686',
'#a48dc1',
'#5da6bc',
'#b9dcae'
];
var Z_TAG_COLORS = [
'#5470c6',
'#91cc75',
'#fac858',
'#ee6666',
'#73c0de',
'#3ba272',
'#fc8452',
'#9a60b4',
'#ea7ccc'
];
var Z_TAG_COLORS_2 = [
'#51689b',
'#ce5c5c',
'#fbc357',
'#8fbf8f',
'#659d84',
'#fb8e6a',
'#c77288',
'#786090',
'#91c4c5',
'#6890ba'
];
var SYMBOL_PATHS = [
'path://m67.25,28.9c27.42,-69.1 134.84,0 0,88.85c-134.84,-88.85 -27.42,-157.96 0,-88.85z',
'path://M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16 16-7.163 16-16-7.163-16-16-16zM22 8c1.105 0 2 1.343 2 3s-0.895 3-2 3-2-1.343-2-3 0.895-3 2-3zM10 8c1.105 0 2 1.343 2 3s-0.895 3-2 3-2-1.343-2-3 0.895-3 2-3zM16 28c-5.215 0-9.544-4.371-10-9.947 2.93 1.691 6.377 2.658 10 2.658s7.070-0.963 10-2.654c-0.455 5.576-4.785 9.942-10 9.942z',
'path://M16 0c-8.837 0-16 7.163-16 16s7.163 16 16 16c8.837 0 16-7.163 16-16s-7.163-16-16-16zM22 7.375c1.999 0 3.625 1.626 3.625 3.625 0 0.199-0.017 0.402-0.051 0.604-0.051 0.301-0.311 0.521-0.616 0.521s-0.566-0.22-0.616-0.522c-0.192-1.146-1.177-1.666-2.341-1.666s-2.149 0.52-2.341 1.666c-0.050 0.301-0.311 0.522-0.616 0.522-0 0 0 0-0 0-0.305 0-0.566-0.22-0.616-0.521-0.034-0.201-0.051-0.404-0.051-0.604 0-1.999 1.626-3.625 3.625-3.625zM10 7.375c1.999 0 3.625 1.626 3.625 3.625 0 0.199-0.017 0.402-0.051 0.604-0.051 0.301-0.311 0.521-0.616 0.521s-0.566-0.22-0.616-0.522c-0.193-1.146-1.177-1.666-2.341-1.666s-2.149 0.52-2.341 1.666c-0.051 0.301-0.311 0.522-0.616 0.522 0 0 0 0 0 0-0.305 0-0.566-0.22-0.616-0.521-0.034-0.201-0.051-0.404-0.051-0.604 0-1.999 1.626-3.625 3.625-3.625zM6 18h6v7.745c-3.44-0.894-6-4.035-6-7.745zM14 26v-8h4v8h-4zM20 25.745v-7.745h6c0 3.71-2.559 6.851-6 7.745z',
'path://M23.6 2c4.637 0 8.4 3.764 8.4 8.401 0 9.132-9.87 11.964-15.999 21.232-6.485-9.326-16.001-11.799-16.001-21.232 0-4.637 3.763-8.401 8.4-8.401 1.886 0 3.625 0.86 5.025 2.12l-2.425 3.88 7 4-4 10 11-12-7-4 1.934-2.901c1.107-0.68 2.35-1.099 3.665-1.099z',
'path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z',
'path://M237.062,81.761L237.062,81.761c-12.144-14.24-25.701-20.1-40.68-19.072 c-10.843,0.747-20.938,5.154-30.257,13.127c-9.51-5.843-19.8-9.227-30.859-10.366c0.521-3.197,1.46-6.306,2.85-9.363 c3.458-7.038,8.907-12.741,16.331-17.296c-5.609-3.384-11.227-6.799-16.854-10.279c-16.257,8.104-25.06,20.601-26.463,38.417 c-7.599,1.705-14.685,4.486-21.247,8.437c-9.164-7.677-18.996-11.917-29.496-12.632c-14.819-0.998-28.467,4.787-40.938,18.827 C6.445,96.182,0,114.867,0,136.242c-0.007,6.371,0.674,12.646,2.053,18.738c4.593,22.785,15.398,41.367,32.558,55.344 c15.43,12.773,29.901,18.023,43.362,16.981c7.074-0.561,13.624-3.977,19.685-10.192c10.534,5.49,20.391,8.217,29.561,8.203 c9.856-0.012,20.236-2.953,31.125-8.898c6.227,6.692,12.966,10.346,20.211,10.933c13.795,1.073,28.614-4.111,44.377-16.84 c17.49-14.104,28.043-32.79,31.796-55.485c0.836-5.624,1.272-11.292,1.272-16.966C255.998,115.814,249.707,96.601,237.062,81.761z M54.795,97.7l40.661,14.496c-4.402,8.811-10.766,13.219-19.06,13.219c-2.542,0-4.917-0.419-7.122-1.274 C58.103,118.38,53.263,109.572,54.795,97.7z M150.613,185.396l-9.156-8.389l-7.619,12.951c-3.391,0.341-6.615,0.514-9.665,0.514 c-4.401,0-8.635-0.263-12.708-0.777l-8.634-14.973l-9.151,9.909c-4.91-2.717-9.15-5.856-12.708-9.413 c-8.81-8.295-13.384-17.959-13.727-28.97c2.877,1.692,7.427,3.461,13.675,5.308l10.636,13.629l9.44-9.852 c4.734,0.702,9.234,1.12,13.466,1.275l10.689,11.498l9.671-11.949c3.559-0.173,7.285-0.515,11.182-1.01l9.924,10.159l10.933-14.227 c5.931-1.351,11.196-2.798,15.771-4.323C179.747,163.538,169.068,176.414,150.613,185.396z M175.258,124.907 c-2.209,0.849-4.66,1.273-7.369,1.273c-8.134,0-14.489-4.415-19.052-13.224l40.905-14.477 C191.105,110.331,186.273,119.141,175.258,124.907z'
];
var CONTENT_COLOR = '#37A2DA';
var ANIMATION_DURATION_UPDATE = 1500;
var RAW_DATA = [
[1425139200000, 34, 0.13, 2, 'MD', 'ZD', 'P0'],
[1425225600000, 28, 0.71, 1.5, 'MB', 'ZD', 'P1'],
[1425312000000, 23, 0.9, 2.8, 'MA', 'ZC', 'P2'],
[1425398400000, 21, 0.58, 6, 'MB', 'ZC', 'P3'],
[1425484800000, 14, 0.1, 1.6, 'MC', 'ZA', 'P4'],
[1425571200000, 21, 0.6, 7.7, 'MC', 'ZA', 'P5'],
[1425657600000, 23, 0.31, 2.6, 'MC', 'ZC', 'P6'],
[1425744000000, 34, 0.74, 2.4, 'MD', 'ZE', 'P7'],
[1425830400000, 14, 0.59, 2.3, 'MB', 'ZD', 'P8'],
[1425916800000, 18, 0.85, 5.1, 'MB', 'ZB', 'P9'],
[1426003200000, 36, 0.96, 1.2, 'MC', 'ZC', 'P10'],
[1426089600000, 18, 0.28, 2.5, 'MA', 'ZC', 'P11'],
[1426176000000, 20, 0.62, 6, 'MB', 'ZD', 'P12'],
[1426262400000, 32, 0.79, 1.7, 'MB', 'ZA', 'P13'],
[1426348800000, 17, 0.58, 4.4, 'MD', 'ZB', 'P14'],
[1426435200000, 23, 0.77, 3, 'MB', 'ZA', 'P15'],
[1426521600000, 39, 0.87, 4.6, 'MC', 'ZA', 'P16'],
[1426608000000, 15, 0.7, 6, 'MB', 'ZC', 'P17'],
[1426694400000, 21, 0.94, 2.7, 'MB', 'ZD', 'P18'],
[1426780800000, 28, 0.48, 4.5, 'MC', 'ZC', 'P19'],
[1426867200000, 31, 0.49, 9.8, 'MA', 'ZC', 'P20'],
[1426953600000, 27, 0.87, 7.7, 'MB', 'ZB', 'P21'],
[1427040000000, 27, 0.82, 5.5, 'MC', 'ZB', 'P22'],
[1427126400000, 11, 0.53, 2.7, 'MD', 'ZC', 'P23'],
[1427212800000, 13, 0.7, 7.6, 'MB', 'ZD', 'P24'],
[1427299200000, 39, 0.99, 4.8, 'MB', 'ZD', 'P25'],
[1427385600000, 32, 0.91, 2.1, 'MB', 'ZE', 'P26'],
[1427472000000, 20, 0.97, 5, 'MB', 'ZA', 'P27'],
[1427558400000, 36, 0.01, 8.9, 'MB', 'ZD', 'P28'],
[1427644800000, 22, 0.08, 9.2, 'MB', 'ZE', 'P29'],
[1427731200000, 21, 0.36, 3.1, 'MD', 'ZC', 'P30'],
[1427817600000, 11, 0.15, 5.8, 'MD', 'ZB', 'P31'],
[1427904000000, 39, 0.02, 1.4, 'MC', 'ZD', 'P32'],
[1427990400000, 20, 0.86, 8.7, 'MB', 'ZD', 'P33'],
[1428076800000, 23, 0.24, 7.2, 'MD', 'ZB', 'P34'],
[1428163200000, 12, 0.06, 2, 'MD', 'ZB', 'P35'],
[1428249600000, 36, 0.42, 8.2, 'MA', 'ZB', 'P36'],
[1428336000000, 17, 0.48, 7.5, 'MB', 'ZC', 'P37'],
[1428422400000, 19, 0.12, 6.6, 'MB', 'ZB', 'P38'],
[1428508800000, 39, 0.58, 3.1, 'MC', 'ZE', 'P39'],
[1428595200000, 10, 0.18, 6.6, 'MC', 'ZD', 'P40'],
[1428681600000, 22, 0.28, 2.1, 'MB', 'ZE', 'P41'],
[1428768000000, 27, 0.33, 1.9, 'MC', 'ZB', 'P42'],
[1428854400000, 37, 0.46, 9.4, 'MD', 'ZE', 'P43'],
[1428940800000, 18, 0.96, 5.5, 'MB', 'ZA', 'P44'],
[1429027200000, 11, 0.61, 8.2, 'MD', 'ZC', 'P45'],
[1429113600000, 15, 0.88, 4.6, 'MD', 'ZA', 'P46'],
[1429200000000, 38, 0.89, 7.2, 'MD', 'ZC', 'P47'],
[1429286400000, 20, 0.39, 5.4, 'MB', 'ZB', 'P48'],
[1429372800000, 30, 0.71, 5.5, 'MA', 'ZA', 'P49']
];
var RAW_DATA_DIMENSIONS = ['DATE', 'ATA', 'STE', 'CTZ', 'M_TAG', 'Z_TAG', 'ID'];
var M_TAG_SUM_DIMENSIONS = ['ATA', 'STE', 'CTZ', 'M_TAG'];
var RAW_CLUSTER_DIMENSIONS = [
'DATE',
'ATA',
'STE',
'CTZ',
'M_TAG',
'Z_TAG',
'ID',
'CLUSTER_IDX',
'CLUSTER_CENTER_ATA',
'CLUSTER_CENTER_STE'
];
var RAW_CLUSTER_CENTERS_DIMENSIONS = [
'COUNT',
'CLUSTER_IDX',
'CLUSTER_CENTER_ATA',
'CLUSTER_CENTER_STE'
];
function getFromPalette(value, palette) {
if (!palette.__colorMap) {
palette.__colorMap = {};
}
if (palette.__colorIdx == null) {
palette.__colorIdx = 0;
}
if (!palette.__colorMap[value]) {
palette.__colorMap[value] = palette[palette.__colorIdx];
palette.__colorIdx++;
if (palette.__colorIdx >= palette.length) {
palette.__colorIdx = 0;
}
}
return palette.__colorMap[value];
}
var baseOption = {
dataset: [
{
id: 'raw',
dimensions: RAW_DATA_DIMENSIONS,
source: RAW_DATA
},
{
id: 'mTagSum',
fromDatasetId: 'raw',
transform: {
type: 'ecSimpleTransform:aggregate',
config: {
resultDimensions: [
{ from: 'ATA', method: 'sum' },
{ from: 'STE', method: 'sum' },
{ from: 'CTZ', method: 'sum' },
{ from: 'M_TAG' }
],
groupBy: 'M_TAG'
}
}
},
{
id: 'rawClusters',
fromDatasetId: 'raw',
transform: {
type: 'ecStat:clustering',
// print: true,
config: {
clusterCount: 4,
dimensions: ['ATA', 'STE'],
outputClusterIndexDimension: {
index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_IDX'),
name: 'CLUSTER_IDX'
},
outputCentroidDimensions: [
{
index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_CENTER_ATA'),
name: 'CLUSTER_CENTER_ATA'
},
{
index: RAW_CLUSTER_DIMENSIONS.indexOf('CLUSTER_CENTER_STE'),
name: 'CLUSTER_CENTER_STE'
}
]
}
}
},
{
id: 'rawClusterCenters',
fromDatasetId: 'rawClusters',
transform: {
type: 'ecSimpleTransform:aggregate',
// print: true,
config: {
resultDimensions: [
{ name: 'COUNT', from: 'ATA', method: 'count' },
{ from: 'CLUSTER_CENTER_ATA' },
{ from: 'CLUSTER_CENTER_STE' },
{ from: 'CLUSTER_IDX' }
],
groupBy: 'CLUSTER_IDX'
}
}
}
],
tooltip: {}
};
function makeScatterOptionCreator(renderItem) {
return function () {
var datasetId = 'rawClusters';
return {
datasetId: datasetId,
option: {
grid: {
containLabel: true
},
xAxis: {
name: 'STE'
},
yAxis: {
name: 'ATA'
},
series: {
type: 'custom',
coordinateSystem: 'cartesian2d',
animationDurationUpdate: ANIMATION_DURATION_UPDATE,
datasetId: datasetId,
encode: {
itemName: 'ID',
x: 'STE',
y: 'ATA',
tooltip: ['STE', 'ATA']
},
renderItem: renderItem
}
}
};
};
}
var optionCreators = {
Scatter: makeScatterOptionCreator(function (params, api) {
var pos = api.coord([api.value('STE'), api.value('ATA')]);
var zTagVal = api.value('Z_TAG');
var color = getFromPalette(zTagVal, Z_TAG_COLORS);
return {
type: 'circle',
morph: true,
shape: {
cx: pos[0],
cy: pos[1],
r: 10
},
style: {
fill: color
},
transition: ['shape', 'style']
};
}),
Glyph: makeScatterOptionCreator(function (params, api) {
var pos = api.coord([api.value('STE'), api.value('ATA')]);
var zTagVal = api.value('Z_TAG');
var color = getFromPalette(zTagVal, Z_TAG_COLORS);
var symbolPath = getFromPalette(zTagVal, SYMBOL_PATHS);
return {
type: 'path',
morph: true,
x: pos[0],
y: pos[1],
shape: {
pathData: symbolPath,
width: 40,
height: 40
},
style: {
fill: color
},
transition: ['style']
};
}),
House: makeScatterOptionCreator(function (params, api) {
var pos = api.coord([api.value('STE'), api.value('ATA')]);
var zTagVal = api.value('Z_TAG');
var color1 = getFromPalette(zTagVal, Z_TAG_COLORS);
var color2 = '#aaa';
return {
type: 'group',
x: pos[0],
y: pos[1],
children: [
{
type: 'polygon',
morph: true,
shape: {
points: [
[-25, -1],
[25, -1],
[0, -20]
]
},
style: {
fill: color1
},
transition: ['shape', 'style']
},
{
type: 'rect',
morph: true,
shape: {
x: -15,
y: 0,
width: 30,
height: 20
},
style: {
fill: color2,
stroke: '#fff',
lineWidth: 1
},
transition: ['shape', 'style']
}
]
};
}),
Bar_Sum: function () {
var datasetId = 'mTagSum';
return {
datasetId: datasetId,
option: {
grid: {
containLabel: true
},
xAxis: {
type: 'category'
},
yAxis: {},
series: {
type: 'custom',
coordinateSystem: 'cartesian2d',
animationDurationUpdate: ANIMATION_DURATION_UPDATE,
datasetId: datasetId,
encode: {
x: 'M_TAG',
y: 'ATA',
tooltip: ['M_TAG', 'ATA']
},
renderItem: function (params, api) {
var mTagVal = api.value('M_TAG');
var ataVal = api.value('ATA');
var tarPos = api.coord([mTagVal, ataVal]);
var zeroPos = api.coord([mTagVal, 0]);
var size = api.size([mTagVal, ataVal]);
var width = size[0] * 0.4;
return {
type: 'rect',
morph: true,
shape: {
x: tarPos[0] - width / 2,
y: tarPos[1],
height: zeroPos[1] - tarPos[1],
width: width
},
style: {
fill: CONTENT_COLOR
},
transition: ['shape', 'style']
};
}
}
}
};
},
Pie_Sum: function () {
var datasetId = 'mTagSum';
return {
datasetId: datasetId,
option: {
series: {
type: 'custom',
coordinateSystem: 'none',
animationDurationUpdate: ANIMATION_DURATION_UPDATE,
datasetId: datasetId,
encode: {
itemName: 'M_TAG',
value: 'ATA',
tooltip: 'ATA'
},
renderItem: function (params, api) {
var context = params.context;
if (!context.layout) {
context.layout = true;
var totalValue = 0;
for (var i = 0; i < params.dataInsideLength; i++) {
totalValue += api.value('ATA', i);
}
var angles = [];
var colors = [];
var currentAngle = -Math.PI / 2;
for (var i = 0; i < params.dataInsideLength; i++) {
colors.push(PIE_COLORS[i]);
var angle = (api.value('ATA', i) / totalValue) * Math.PI * 2;
angles.push([currentAngle, angle + currentAngle - 0.01]);
currentAngle += angle;
}
context.angles = angles;
context.colors = colors;
}
var width = myChart.getWidth();
var height = myChart.getHeight();
return {
type: 'sector',
morph: true,
shape: {
cx: width / 2,
cy: height / 2,
r: Math.min(width, height) / 3,
r0: Math.min(width, height) / 5,
startAngle: context.angles[params.dataIndex][0],
endAngle: context.angles[params.dataIndex][1],
clockwise: true
},
style: {
// fill: CONTENT_COLOR,
fill: context.colors[params.dataIndex]
},
transition: ['shape', 'style']
};
}
}
}
};
},
Clustered: function () {
var datasetId = 'rawClusterCenters';
return {
datasetId: datasetId,
option: {
grid: {
containLabel: true
},
xAxis: {
name: 'STE'
},
yAxis: {
name: 'ATA'
},
series: {
type: 'custom',
coordinateSystem: 'cartesian2d',
animationDurationUpdate: ANIMATION_DURATION_UPDATE,
datasetId: datasetId,
encode: {
x: 'CLUSTER_CENTER_STE',
y: 'CLUSTER_CENTER_ATA',
tooltip: ['CLUSTER_CENTER_STE', 'CLUSTER_CENTER_ATA']
},
renderItem: function (params, api) {
var context = params.context;
if (!context.layout) {
context.layout = true;
context.totalCount = 0;
for (var i = 0; i < params.dataInsideLength; i++) {
context.totalCount += api.value('COUNT', i);
}
}
var pos = api.coord([
api.value('CLUSTER_CENTER_STE'),
api.value('CLUSTER_CENTER_ATA')
]);
var count = api.value('COUNT');
var radius = (count / context.totalCount) * 100 + 10;
return {
type: 'circle',
morph: true,
shape: {
cx: pos[0],
cy: pos[1],
r: radius
},
style: {
// fill: CONTENT_COLOR,
fill: CLUSTER_COLORS[params.dataIndex]
},
transition: ['shape', 'style']
};
}
}
}
};
}
};
var _player;
var _optionList = [];
app.config = {};
echarts.util.each(optionCreators, function (creator, key) {
var optionWrap = creator();
_optionList.push({
key: key,
dataMetaKey: optionWrap.datasetId,
option: optionWrap.option
});
app.config[key] = function () {
_player.go(key);
};
});
console.log(app.config);
$.when(
$.getScript(
'https://fastly.jsdelivr.net/npm/echarts-simple-transform/dist/ecSimpleTransform.min.js'
),
$.getScript(
'https://fastly.jsdelivr.net/npm/echarts-simple-option-player/dist/ecSimpleOptionPlayer.min.js'
)
).done(function () {
run();
});
function run() {
echarts.registerTransform(ecSimpleTransform.aggregate);
echarts.registerTransform(ecStat.transform.clustering);
_player = ecSimpleOptionPlayer.create({
chart: function () {
return myChart;
},
seriesIndex: 0,
replaceMerge: ['xAxis', 'yAxis'],
dataMeta: {
raw: {
dimensions: RAW_DATA_DIMENSIONS,
uniqueDimension: 'ID'
},
mTagSum: {
dimensions: M_TAG_SUM_DIMENSIONS,
uniqueDimension: 'M_TAG'
},
rawClusters: {
dimensions: RAW_CLUSTER_DIMENSIONS,
uniqueDimension: 'ID',
dividingMethod: 'duplicate'
},
rawClusterCenters: {
dimensions: RAW_CLUSTER_CENTERS_DIMENSIONS,
uniqueDimension: 'CLUSTER_IDX'
}
},
optionList: _optionList
});
myChart.setOption(baseOption, { lazyUpdate: true });
_player.go('Glyph');
}