You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by ov...@apache.org on 2018/08/27 05:33:52 UTC

[incubator-echarts] branch master updated: fix(polar): fix polar axis category interval #8791

This is an automated email from the ASF dual-hosted git repository.

ovilia pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git


The following commit(s) were added to refs/heads/master by this push:
     new ebadaf7  fix(polar): fix polar axis category interval #8791
ebadaf7 is described below

commit ebadaf70cc5b53e9041cda60508e6567dcc1c608
Author: Ovilia <zw...@gmail.com>
AuthorDate: Mon Aug 27 13:33:19 2018 +0800

    fix(polar): fix polar axis category interval #8791
---
 src/coord/axisTickLabelBuilder.js |  1 -
 src/coord/polar/AngleAxis.js      | 71 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/src/coord/axisTickLabelBuilder.js b/src/coord/axisTickLabelBuilder.js
index e1a849c..822cd9d 100644
--- a/src/coord/axisTickLabelBuilder.js
+++ b/src/coord/axisTickLabelBuilder.js
@@ -217,7 +217,6 @@ export function calculateCategoryInterval(axis) {
         var width = 0;
         var height = 0;
 
-        // Polar is also calculated in assumptive linear layout here.
         // Not precise, do not consider align and vertical align
         // and each distance from axis line yet.
         var rect = textContain.getBoundingRect(
diff --git a/src/coord/polar/AngleAxis.js b/src/coord/polar/AngleAxis.js
index 175efc2..1dae806 100644
--- a/src/coord/polar/AngleAxis.js
+++ b/src/coord/polar/AngleAxis.js
@@ -18,7 +18,11 @@
 */
 
 import * as zrUtil from 'zrender/src/core/util';
+import * as textContain from 'zrender/src/contain/text';
 import Axis from '../Axis';
+import {makeInner} from '../../util/model';
+
+var inner = makeInner();
 
 function AngleAxis(scale, angleExtent) {
 
@@ -50,7 +54,72 @@ AngleAxis.prototype = {
 
     dataToAngle: Axis.prototype.dataToCoord,
 
-    angleToData: Axis.prototype.coordToData
+    angleToData: Axis.prototype.coordToData,
+
+    /**
+     * Only be called in category axis.
+     * Angle axis uses text height to decide interval
+     *
+     * @override
+     * @return {number} Auto interval for cateogry axis tick and label
+     */
+    calculateCategoryInterval: function () {
+        var axis = this;
+        var labelModel = axis.getLabelModel();
+
+        var ordinalScale = axis.scale;
+        var ordinalExtent = ordinalScale.getExtent();
+        // Providing this method is for optimization:
+        // avoid generating a long array by `getTicks`
+        // in large category data case.
+        var tickCount = ordinalScale.count();
+
+        if (ordinalExtent[1] - ordinalExtent[0] < 1) {
+            return 0;
+        }
+
+        var tickValue = ordinalExtent[0];
+        var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue);
+        var unitH = Math.abs(unitSpan);
+
+        // Not precise, just use height as text width
+        // and each distance from axis line yet.
+        var rect = textContain.getBoundingRect(
+            tickValue, labelModel.getFont(), 'center', 'top'
+        );
+        var maxH = Math.max(rect.height, 7);
+
+        var dh = maxH / unitH;
+        // 0/0 is NaN, 1/0 is Infinity.
+        isNaN(dh) && (dh = Infinity);
+        var interval = Math.max(0, Math.floor(dh));
+
+        var cache = inner(axis.model);
+        var lastAutoInterval = cache.lastAutoInterval;
+        var lastTickCount = cache.lastTickCount;
+
+        // Use cache to keep interval stable while moving zoom window,
+        // otherwise the calculated interval might jitter when the zoom
+        // window size is close to the interval-changing size.
+        if (lastAutoInterval != null
+            && lastTickCount != null
+            && Math.abs(lastAutoInterval - interval) <= 1
+            && Math.abs(lastTickCount - tickCount) <= 1
+            // Always choose the bigger one, otherwise the critical
+            // point is not the same when zooming in or zooming out.
+            && lastAutoInterval > interval
+        ) {
+            interval = lastAutoInterval;
+        }
+        // Only update cache if cache not used, otherwise the
+        // changing of interval is too insensitive.
+        else {
+            cache.lastTickCount = tickCount;
+            cache.lastAutoInterval = interval;
+        }
+
+        return interval;
+    }
 };
 
 zrUtil.inherits(AngleAxis, Axis);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org