/*
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');
}
