tweak showMaxLabel and showMinLabel
diff --git a/src/component/axis/AxisBuilder.js b/src/component/axis/AxisBuilder.js
index 90d10e7..643bb5b 100644
--- a/src/component/axis/AxisBuilder.js
+++ b/src/component/axis/AxisBuilder.js
@@ -171,187 +171,14 @@
         /**
          * @private
          */
-        axisTick: function () {
+        axisTickLabel: function () {
             var axisModel = this.axisModel;
-            var axis = axisModel.axis;
-
-            if (!axisModel.get('axisTick.show') || axis.scale.isBlank()) {
-                return;
-            }
-
-            var tickModel = axisModel.getModel('axisTick');
             var opt = this.opt;
 
-            var lineStyleModel = tickModel.getModel('lineStyle');
-            var tickLen = tickModel.get('length');
+            var tickEls = buildAxisTick(this, axisModel, opt);
+            var labelEls = buildAxisLabel(this, axisModel, opt);
 
-            var tickInterval = getInterval(tickModel, opt.labelInterval);
-            var ticksCoords = axis.getTicksCoords(tickModel.get('alignWithLabel'));
-            var ticks = axis.scale.getTicks();
-
-            var showMinLabel = axisModel.get('axisLabel.showMinLabel');
-            var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');
-
-            var pt1 = [];
-            var pt2 = [];
-            var matrix = this._transform;
-
-            var tickEls = [];
-
-            var ticksCnt = ticksCoords.length;
-            for (var i = 0; i < ticksCnt; i++) {
-                // Only ordinal scale support tick interval
-                if (ifIgnoreOnTick(axis, i, tickInterval, ticksCnt,
-                    showMinLabel, showMaxLabel)
-                ) {
-                     continue;
-                }
-
-                var tickCoord = ticksCoords[i];
-
-                pt1[0] = tickCoord;
-                pt1[1] = 0;
-                pt2[0] = tickCoord;
-                pt2[1] = opt.tickDirection * tickLen;
-
-                if (matrix) {
-                    v2ApplyTransform(pt1, pt1, matrix);
-                    v2ApplyTransform(pt2, pt2, matrix);
-                }
-                // Tick line, Not use group transform to have better line draw
-                var tickEl = new graphic.Line(graphic.subPixelOptimizeLine({
-                    // Id for animation
-                    anid: 'tick_' + ticks[i],
-
-                    shape: {
-                        x1: pt1[0],
-                        y1: pt1[1],
-                        x2: pt2[0],
-                        y2: pt2[1]
-                    },
-                    style: zrUtil.defaults(
-                        lineStyleModel.getLineStyle(),
-                        {
-                            stroke: axisModel.get('axisLine.lineStyle.color')
-                        }
-                    ),
-                    z2: 2,
-                    silent: true
-                }));
-                this.group.add(tickEl);
-                tickEls.push(tickEl);
-            }
-
-            fixMinMaxLabelShow(axisModel, this.textEls, tickEls);
-        },
-
-        /**
-         * @param {module:echarts/coord/cartesian/AxisModel} axisModel
-         * @param {module:echarts/coord/cartesian/GridModel} gridModel
-         * @private
-         */
-        axisLabel: function () {
-            var opt = this.opt;
-            var axisModel = this.axisModel;
-            var axis = axisModel.axis;
-            var show = retrieve(opt.axisLabelShow, axisModel.get('axisLabel.show'));
-
-            if (!show || axis.scale.isBlank()) {
-                return;
-            }
-
-            var labelModel = axisModel.getModel('axisLabel');
-            var labelMargin = labelModel.get('margin');
-            var ticks = axis.scale.getTicks();
-            var labels = axisModel.getFormattedLabels();
-
-            // Special label rotate.
-            var labelRotation = (
-                retrieve(opt.labelRotate, labelModel.get('rotate')) || 0
-            ) * PI / 180;
-
-            var labelLayout = innerTextLayout(opt.rotation, labelRotation, opt.labelDirection);
-            var categoryData = axisModel.get('data');
-
-            this.textEls = [];
-            var silent = isSilent(axisModel);
-            var triggerEvent = axisModel.get('triggerEvent');
-
-            var showMinLabel = axisModel.get('axisLabel.showMinLabel');
-            var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');
-
-            zrUtil.each(ticks, function (tickVal, index) {
-                if (ifIgnoreOnTick(axis, index, opt.labelInterval, ticks.length,
-                    showMinLabel, showMaxLabel)
-                ) {
-                     return;
-                }
-
-                var itemLabelModel = labelModel;
-                if (categoryData && categoryData[tickVal] && categoryData[tickVal].textStyle) {
-                    itemLabelModel = new Model(
-                        categoryData[tickVal].textStyle, labelModel, axisModel.ecModel
-                    );
-                }
-
-                var textColor = itemLabelModel.getTextColor()
-                    || axisModel.get('axisLine.lineStyle.color');
-
-                var tickCoord = axis.dataToCoord(tickVal);
-                var pos = [
-                    tickCoord,
-                    opt.labelOffset + opt.labelDirection * labelMargin
-                ];
-                var labelStr = axis.scale.getLabel(tickVal);
-
-                var textEl = new graphic.Text({
-                    // Id for animation
-                    anid: 'label_' + tickVal,
-                    position: pos,
-                    rotation: labelLayout.rotation,
-                    silent: silent,
-                    z2: 10
-                });
-
-                graphic.setTextStyle(textEl.style, itemLabelModel, {
-                    text: labels[index],
-                    textAlign: itemLabelModel.getShallow('align', true)
-                        || labelLayout.textAlign,
-                    textVerticalAlign: itemLabelModel.getShallow('verticalAlign', true)
-                        || itemLabelModel.getShallow('baseline', true)
-                        || labelLayout.textVerticalAlign,
-                    textFill: typeof textColor === 'function'
-                        ? textColor(
-                            // (1) In category axis with data zoom, tick is not the original
-                            // index of axis.data. So tick should not be exposed to user
-                            // in category axis.
-                            // (2) Compatible with previous version, which always returns labelStr.
-                            // But in interval scale labelStr is like '223,445', which maked
-                            // user repalce ','. So we modify it to return original val but remain
-                            // it as 'string' to avoid error in replacing.
-                            axis.type === 'category' ? labelStr : axis.type === 'value' ? tickVal + '' : tickVal,
-                            index
-                        )
-                        : textColor
-                });
-
-                // Pack data for mouse event
-                if (triggerEvent) {
-                    textEl.eventData = makeAxisEventDataBase(axisModel);
-                    textEl.eventData.targetType = 'axisLabel';
-                    textEl.eventData.value = labelStr;
-                }
-
-                // FIXME
-                this._dumbGroup.add(textEl);
-                textEl.updateTransform();
-
-                this.textEls.push(textEl);
-                this.group.add(textEl);
-
-                textEl.decomposeTransform();
-
-            }, this);
+            fixMinMaxLabelShow(axisModel, labelEls, tickEls);
         },
 
         /**
@@ -573,17 +400,23 @@
             );
     }
 
-    function fixMinMaxLabelShow(axisModel, textEls, tickEls) {
+    function fixMinMaxLabelShow(axisModel, labelEls, tickEls) {
         // If min or max are user set, we need to check
         // If the tick on min(max) are overlap on their neighbour tick
         // If they are overlapped, we need to hide the min(max) tick label
         var showMinLabel = axisModel.get('axisLabel.showMinLabel');
         var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');
 
-        var firstLabel = textEls[0];
-        var nextLabel = textEls[1];
-        var lastLabel = textEls[textEls.length - 1];
-        var prevLabel = textEls[textEls.length - 2];
+        // FIXME
+        // Have not consider onBand yet, where tick els is more than label els.
+
+        labelEls = labelEls || [];
+        tickEls = tickEls || [];
+
+        var firstLabel = labelEls[0];
+        var nextLabel = labelEls[1];
+        var lastLabel = labelEls[labelEls.length - 1];
+        var prevLabel = labelEls[labelEls.length - 2];
 
         var firstTick = tickEls[0];
         var nextTick = tickEls[1];
@@ -591,35 +424,40 @@
         var prevTick = tickEls[tickEls.length - 2];
 
         if (showMinLabel === false) {
-            firstLabel.ignore = true;
-            tickEls[0].ignore = true;
+            ignoreEl(firstLabel);
+            ignoreEl(firstTick);
         }
-        else if (axisModel.getMin() != null && isTwoLabelOverlapped(firstLabel, nextLabel)) {
+        else if (isTwoLabelOverlapped(firstLabel, nextLabel)) {
             if (showMinLabel) {
-                nextLabel.ignore = true;
-                nextTick.ignore = true;
+                ignoreEl(nextLabel);
+                ignoreEl(nextTick);
             }
             else {
-                firstLabel.ignore = true;
-                firstTick.ignore = true;
+                ignoreEl(firstLabel);
+                ignoreEl(firstTick);
             }
         }
 
         if (showMaxLabel === false) {
-            lastLabel.ignore = true;
+            ignoreEl(lastLabel);
+            ignoreEl(lastTick);
         }
-        else if (axisModel.getMax() != null && isTwoLabelOverlapped(prevLabel, lastLabel)) {
+        else if (isTwoLabelOverlapped(prevLabel, lastLabel)) {
             if (showMaxLabel) {
-                prevLabel.ignore = true;
-                prevTick.ignore = true;
+                ignoreEl(prevLabel);
+                ignoreEl(prevTick);
             }
             else {
-                lastLabel.ignore = true;
-                lastTick.ignore = true;
+                ignoreEl(lastLabel);
+                ignoreEl(lastTick);
             }
         }
     }
 
+    function ignoreEl(el) {
+        el && (el.ignore = true);
+    }
+
     function isTwoLabelOverlapped(current, next, labelLayout) {
         // current and next has the same rotation.
         var firstRect = current && current.getBoundingRect().clone();
@@ -659,6 +497,9 @@
             return false;
         }
 
+        // FIXME
+        // Have not consider label overlap (if label is too long) yet.
+
         var rawTick;
         var scale = axis.scale;
         return scale.type === 'ordinal'
@@ -683,6 +524,187 @@
         return interval;
     };
 
+    function buildAxisTick(axisBuilder, axisModel, opt) {
+        var axis = axisModel.axis;
+
+        if (!axisModel.get('axisTick.show') || axis.scale.isBlank()) {
+            return;
+        }
+
+        var tickModel = axisModel.getModel('axisTick');
+
+        var lineStyleModel = tickModel.getModel('lineStyle');
+        var tickLen = tickModel.get('length');
+
+        var tickInterval = getInterval(tickModel, opt.labelInterval);
+        var ticksCoords = axis.getTicksCoords(tickModel.get('alignWithLabel'));
+        // FIXME
+        // Corresponds to ticksCoords ?
+        var ticks = axis.scale.getTicks();
+
+        var showMinLabel = axisModel.get('axisLabel.showMinLabel');
+        var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');
+
+        var pt1 = [];
+        var pt2 = [];
+        var matrix = axisBuilder._transform;
+
+        var tickEls = [];
+
+        var ticksCnt = ticksCoords.length;
+        for (var i = 0; i < ticksCnt; i++) {
+            // Only ordinal scale support tick interval
+            if (ifIgnoreOnTick(
+                axis, i, tickInterval, ticksCnt,
+                showMinLabel, showMaxLabel
+            )) {
+                continue;
+            }
+
+            var tickCoord = ticksCoords[i];
+
+            pt1[0] = tickCoord;
+            pt1[1] = 0;
+            pt2[0] = tickCoord;
+            pt2[1] = opt.tickDirection * tickLen;
+
+            if (matrix) {
+                v2ApplyTransform(pt1, pt1, matrix);
+                v2ApplyTransform(pt2, pt2, matrix);
+            }
+            // Tick line, Not use group transform to have better line draw
+            var tickEl = new graphic.Line(graphic.subPixelOptimizeLine({
+                // Id for animation
+                anid: 'tick_' + ticks[i],
+
+                shape: {
+                    x1: pt1[0],
+                    y1: pt1[1],
+                    x2: pt2[0],
+                    y2: pt2[1]
+                },
+                style: zrUtil.defaults(
+                    lineStyleModel.getLineStyle(),
+                    {
+                        stroke: axisModel.get('axisLine.lineStyle.color')
+                    }
+                ),
+                z2: 2,
+                silent: true
+            }));
+            axisBuilder.group.add(tickEl);
+            tickEls.push(tickEl);
+        }
+
+        return tickEls;
+    }
+
+    function buildAxisLabel(axisBuilder, axisModel, opt) {
+        var axis = axisModel.axis;
+        var show = retrieve(opt.axisLabelShow, axisModel.get('axisLabel.show'));
+
+        if (!show || axis.scale.isBlank()) {
+            return;
+        }
+
+        var labelModel = axisModel.getModel('axisLabel');
+        var labelMargin = labelModel.get('margin');
+        var ticks = axis.scale.getTicks();
+        var labels = axisModel.getFormattedLabels();
+
+        // Special label rotate.
+        var labelRotation = (
+            retrieve(opt.labelRotate, labelModel.get('rotate')) || 0
+        ) * PI / 180;
+
+        var labelLayout = innerTextLayout(opt.rotation, labelRotation, opt.labelDirection);
+        var categoryData = axisModel.get('data');
+
+        var labelEls = [];
+        var silent = isSilent(axisModel);
+        var triggerEvent = axisModel.get('triggerEvent');
+
+        var showMinLabel = axisModel.get('axisLabel.showMinLabel');
+        var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');
+
+        zrUtil.each(ticks, function (tickVal, index) {
+            if (ifIgnoreOnTick(
+                axis, index, opt.labelInterval, ticks.length,
+                showMinLabel, showMaxLabel
+            )) {
+                    return;
+            }
+
+            var itemLabelModel = labelModel;
+            if (categoryData && categoryData[tickVal] && categoryData[tickVal].textStyle) {
+                itemLabelModel = new Model(
+                    categoryData[tickVal].textStyle, labelModel, axisModel.ecModel
+                );
+            }
+
+            var textColor = itemLabelModel.getTextColor()
+                || axisModel.get('axisLine.lineStyle.color');
+
+            var tickCoord = axis.dataToCoord(tickVal);
+            var pos = [
+                tickCoord,
+                opt.labelOffset + opt.labelDirection * labelMargin
+            ];
+            var labelStr = axis.scale.getLabel(tickVal);
+
+            var textEl = new graphic.Text({
+                // Id for animation
+                anid: 'label_' + tickVal,
+                position: pos,
+                rotation: labelLayout.rotation,
+                silent: silent,
+                z2: 10
+            });
+
+            graphic.setTextStyle(textEl.style, itemLabelModel, {
+                text: labels[index],
+                textAlign: itemLabelModel.getShallow('align', true)
+                    || labelLayout.textAlign,
+                textVerticalAlign: itemLabelModel.getShallow('verticalAlign', true)
+                    || itemLabelModel.getShallow('baseline', true)
+                    || labelLayout.textVerticalAlign,
+                textFill: typeof textColor === 'function'
+                    ? textColor(
+                        // (1) In category axis with data zoom, tick is not the original
+                        // index of axis.data. So tick should not be exposed to user
+                        // in category axis.
+                        // (2) Compatible with previous version, which always returns labelStr.
+                        // But in interval scale labelStr is like '223,445', which maked
+                        // user repalce ','. So we modify it to return original val but remain
+                        // it as 'string' to avoid error in replacing.
+                        axis.type === 'category' ? labelStr : axis.type === 'value' ? tickVal + '' : tickVal,
+                        index
+                    )
+                    : textColor
+            });
+
+            // Pack data for mouse event
+            if (triggerEvent) {
+                textEl.eventData = makeAxisEventDataBase(axisModel);
+                textEl.eventData.targetType = 'axisLabel';
+                textEl.eventData.value = labelStr;
+            }
+
+            // FIXME
+            axisBuilder._dumbGroup.add(textEl);
+            textEl.updateTransform();
+
+            labelEls.push(textEl);
+            axisBuilder.group.add(textEl);
+
+            textEl.decomposeTransform();
+
+        });
+
+        return labelEls;
+    }
+
+
     return AxisBuilder;
 
 });
\ No newline at end of file
diff --git a/src/component/axis/CartesianAxisView.js b/src/component/axis/CartesianAxisView.js
index 6bedbd2..4c2e8e2 100644
--- a/src/component/axis/CartesianAxisView.js
+++ b/src/component/axis/CartesianAxisView.js
@@ -9,7 +9,7 @@
     var getInterval = AxisBuilder.getInterval;
 
     var axisBuilderAttrs = [
-        'axisLine', 'axisLabel', 'axisTick', 'axisName'
+        'axisLine', 'axisTickLabel', 'axisName'
     ];
     var selfBuilderAttrs = [
         'splitArea', 'splitLine'
@@ -106,7 +106,8 @@
             // Batching the lines if color are the same
             var lineStyle = lineStyleModel.getLineStyle();
             for (var i = 0; i < ticksCoords.length; i++) {
-                if (ifIgnoreOnTick(axis, i, lineInterval, ticksCoords.length,
+                if (ifIgnoreOnTick(
+                    axis, i, lineInterval, ticksCoords.length,
                     showMinLabel, showMaxLabel
                 )) {
                     continue;
@@ -183,7 +184,8 @@
             var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');
 
             for (var i = 1; i < ticksCoords.length; i++) {
-                if (ifIgnoreOnTick(axis, i, areaInterval, ticksCoords.length,
+                if (ifIgnoreOnTick(
+                    axis, i, areaInterval, ticksCoords.length,
                     showMinLabel, showMaxLabel
                 )) {
                     continue;
diff --git a/src/component/axis/ParallelAxisView.js b/src/component/axis/ParallelAxisView.js
index 3493cea..e438a56 100644
--- a/src/component/axis/ParallelAxisView.js
+++ b/src/component/axis/ParallelAxisView.js
@@ -6,7 +6,7 @@
     var brushHelper = require('../helper/brushHelper');
     var graphic = require('../../util/graphic');
 
-    var elementList = ['axisLine', 'axisLabel', 'axisTick', 'axisName'];
+    var elementList = ['axisLine', 'axisTickLabel', 'axisName'];
 
     var AxisView = require('../../echarts').extendComponentView({
 
diff --git a/src/component/axis/RadiusAxisView.js b/src/component/axis/RadiusAxisView.js
index 1346dda..1365845 100644
--- a/src/component/axis/RadiusAxisView.js
+++ b/src/component/axis/RadiusAxisView.js
@@ -7,7 +7,7 @@
     var AxisBuilder = require('./AxisBuilder');
 
     var axisBuilderAttrs = [
-        'axisLine', 'axisLabel', 'axisTick', 'axisName'
+        'axisLine', 'axisTickLabel', 'axisName'
     ];
     var selfBuilderAttrs = [
         'splitLine', 'splitArea'
diff --git a/src/component/axis/SingleAxisView.js b/src/component/axis/SingleAxisView.js
index 78caa31..c62cb80 100644
--- a/src/component/axis/SingleAxisView.js
+++ b/src/component/axis/SingleAxisView.js
@@ -8,7 +8,7 @@
     var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick;
 
     var axisBuilderAttrs = [
-        'axisLine', 'axisLabel', 'axisTick', 'axisName'
+        'axisLine', 'axisTickLabel', 'axisName'
     ];
 
     var selfBuilderAttr = 'splitLine';
@@ -70,7 +70,8 @@
             var showMaxLabel = axisModel.get('axisLabel.showMaxLabel');
 
             for (var i = 0; i < ticksCoords.length; ++i) {
-                if (ifIgnoreOnTick(axis, i, lineInterval, ticksCoords.length,
+                if (ifIgnoreOnTick(
+                    axis, i, lineInterval, ticksCoords.length,
                     showMinLabel, showMaxLabel
                 )) {
                     continue;
diff --git a/src/component/radar/RadarView.js b/src/component/radar/RadarView.js
index 4289860..75f94c8 100644
--- a/src/component/radar/RadarView.js
+++ b/src/component/radar/RadarView.js
@@ -5,7 +5,7 @@
     var graphic = require('../../util/graphic');
 
     var axisBuilderAttrs = [
-        'axisLine', 'axisLabel', 'axisTick', 'axisName'
+        'axisLine', 'axisTickLabel', 'axisName'
     ];
 
     return require('../../echarts').extendComponentView({