docs: function (option) {
      var mappingMethod = option.mappingMethod;
      var visualType = option.type;
  
      /**
       * @readOnly
       * @type {Object}
       */
      var thisOption = this.option = zrUtil.clone(option);
  
      /**
       * @readOnly
       * @type {string}
       */
      this.type = visualType;
  
      /**
       * @readOnly
       * @type {string}
       */
      this.mappingMethod = mappingMethod;
  
      /**
       * @private
       * @type {Function}
       */
      this._normalizeData = normalizers[mappingMethod];
  
      var visualHandler = visualHandlers[visualType];
  
      /**
       * @public
       * @type {Function}
       */
      this.applyVisual = visualHandler.applyVisual;
  
      /**
       * @public
       * @type {Function}
       */
      this.getColorMapper = visualHandler.getColorMapper;
  
      /**
       * @private
       * @type {Function}
       */
      this._doMap = visualHandler._doMap[mappingMethod];
  
      if (mappingMethod === 'piecewise') {
          normalizeVisualRange(thisOption);
          preprocessForPiecewise(thisOption);
      }
      else if (mappingMethod === 'category') {
          thisOption.categories
              ? preprocessForSpecifiedCategory(thisOption)
              // categories is ordinal when thisOption.categories not specified,
              // which need no more preprocess except normalize visual.
              : normalizeVisualRange(thisOption, true);
      }
      else { // mappingMethod === 'linear' or 'fixed'
          zrUtil.assert(mappingMethod !== 'linear' || thisOption.dataExtent);
          normalizeVisualRange(thisOption);
      }
  }