src/component/axis/AxisBuilder.js
function (axisModel, opt) {

    /**
     * @readOnly
     */
    this.opt = opt;

    /**
     * @readOnly
     */
    this.axisModel = axisModel;

    // Default value
    defaults(
        opt,
        {
            labelOffset: 0,
            nameDirection: 1,
            tickDirection: 1,
            labelDirection: 1,
            silent: true
        }
    );

    /**
     * @readOnly
     */
    this.group = new graphic.Group();

    // FIXME Not use a seperate text group?
    var dumbGroup = new graphic.Group({
        position: opt.position.slice(),
        rotation: opt.rotation
    });

    // this.group.add(dumbGroup);
    // this._dumbGroup = dumbGroup;

    dumbGroup.updateTransform();
    this._transform = dumbGroup.transform;

    this._dumbGroup = dumbGroup;
}
function (axisModel, opt) {

    /**
     * @readOnly
     */
    this.opt = opt;

    /**
     * @readOnly
     */
    this.axisModel = axisModel;

    // Default value
    defaults(
        opt,
        {
            labelOffset: 0,
            nameDirection: 1,
            tickDirection: 1,
            labelDirection: 1,
            silent: true
        }
    );

    /**
     * @readOnly
     */
    this.group = new graphic.Group();

    // FIXME Not use a seperate text group?
    var dumbGroup = new graphic.Group({
        position: opt.position.slice(),
        rotation: opt.rotation
    });

    // this.group.add(dumbGroup);
    // this._dumbGroup = dumbGroup;

    dumbGroup.updateTransform();
    this._transform = dumbGroup.transform;

    this._dumbGroup = dumbGroup;
}
function ( axisModel , opt ) { /**
     * @readOnly
     */ this . opt = opt ; /**
     * @readOnly
     */ this . axisModel = axisModel ; // Default value defaults ( opt , { labelOffset : 0 , nameDirection : 1 , tickDirection : 1 , labelDirection : 1 , silent : true } ) ; /**
     * @readOnly
     */ this . group = new graphic . Group ( ) ; // FIXME Not use a seperate text group? var dumbGroup = new graphic . Group ( { position : opt . position . slice ( ) , rotation : opt . rotation } ) ; // this.group.add(dumbGroup); // this._dumbGroup = dumbGroup; dumbGroup . updateTransform ( ) ; this . _transform = dumbGroup . transform ; this . _dumbGroup = dumbGroup ; }
A final axis is translated and rotated from a "standard axis".
So opt.position and opt.rotation is required.

A standard axis is and axis from [0, 0] to [0, axisExtent[1]],
for example: (0, 0) ------------> (0, 50)

nameDirection or tickDirection or labelDirection is 1 means tick
or label is below the standard axis, whereas is -1 means above
the standard axis. labelOffset means offset between label and axis,
which is useful when 'onZero', where axisLabel is in the grid and
label in outside grid.

Tips: like always,
positive rotation represents anticlockwise, and negative rotation
represents clockwise.
The direction of position coordinate is the same as the direction
of screen coordinate.

Do not need to consider axis 'inverse', which is auto processed by
axis extent.

@param {module:zrender/container/Group} group
@param {Object} axisModel
@param {Object} opt Standard axis parameters.
@param {Array.<number>} opt.position [x, y]
@param {number} opt.rotation by radian
@param {number} [opt.nameDirection=1] 1 or -1 Used when nameLocation is 'middle' or 'center'.
@param {number} [opt.tickDirection=1] 1 or -1
@param {number} [opt.labelDirection=1] 1 or -1
@param {number} [opt.labelOffset=0] Usefull when onZero.
@param {string} [opt.axisLabelShow] default get from axisModel.
@param {string} [opt.axisName] default get from axisModel.
@param {number} [opt.axisNameAvailableWidth]
@param {number} [opt.labelRotate] by degree, default get from axisModel.
@param {number} [opt.strokeContainThreshold] Default label interval when label
@param {number} [opt.nameTruncateMaxWidth]
A final axis is translated and rotated from a standard axis . So opt . position and opt . rotation is required .