提交 ebadaf70 编写于 作者: O Ovilia

fix(polar): fix polar axis category interval #8791

上级 75c02aab
...@@ -217,7 +217,6 @@ export function calculateCategoryInterval(axis) { ...@@ -217,7 +217,6 @@ export function calculateCategoryInterval(axis) {
var width = 0; var width = 0;
var height = 0; var height = 0;
// Polar is also calculated in assumptive linear layout here.
// Not precise, do not consider align and vertical align // Not precise, do not consider align and vertical align
// and each distance from axis line yet. // and each distance from axis line yet.
var rect = textContain.getBoundingRect( var rect = textContain.getBoundingRect(
......
...@@ -18,7 +18,11 @@ ...@@ -18,7 +18,11 @@
*/ */
import * as zrUtil from 'zrender/src/core/util'; import * as zrUtil from 'zrender/src/core/util';
import * as textContain from 'zrender/src/contain/text';
import Axis from '../Axis'; import Axis from '../Axis';
import {makeInner} from '../../util/model';
var inner = makeInner();
function AngleAxis(scale, angleExtent) { function AngleAxis(scale, angleExtent) {
...@@ -50,7 +54,72 @@ AngleAxis.prototype = { ...@@ -50,7 +54,72 @@ AngleAxis.prototype = {
dataToAngle: Axis.prototype.dataToCoord, 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); zrUtil.inherits(AngleAxis, Axis);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册