From f4ac290dcbee052e5e1337d9b68013995fc745a4 Mon Sep 17 00:00:00 2001 From: Savas Vedova <svedova@gitlab.com> Date: Mon, 23 Aug 2021 13:24:30 +0300 Subject: [PATCH 1/5] Fix: time axis overlapped labels --- src/component/axis/AxisBuilder.ts | 11 +++++++++++ src/label/labelLayoutHelper.ts | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/component/axis/AxisBuilder.ts b/src/component/axis/AxisBuilder.ts index c262931039..eb7c2ca973 100644 --- a/src/component/axis/AxisBuilder.ts +++ b/src/component/axis/AxisBuilder.ts @@ -33,6 +33,7 @@ import { AxisBaseOption } from '../../coord/axisCommonTypes'; import Element from 'zrender/src/Element'; import { PathStyleProps } from 'zrender/src/graphic/Path'; import OrdinalScale from '../../scale/Ordinal'; +import { prepareLayoutList, hideOverlap } from '../../label/labelLayoutHelper'; const PI = Math.PI; @@ -347,6 +348,16 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu fixMinMaxLabelShow(axisModel, labelEls, ticksEls); buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection); + + const labelList = prepareLayoutList(labelEls.map(label => ({ + label, + priority: label.style.text?.includes('primary') ? 1 : 0, + defaultAttr: { + ignore: label.ignore + } + }))); + + hideOverlap(labelList); }, axisName(opt, axisModel, group, transformGroup) { diff --git a/src/label/labelLayoutHelper.ts b/src/label/labelLayoutHelper.ts index d22bb77894..2f42db5c7c 100644 --- a/src/label/labelLayoutHelper.ts +++ b/src/label/labelLayoutHelper.ts @@ -24,12 +24,12 @@ import type Element from 'zrender/src/Element'; interface LabelLayoutListPrepareInput { label: ZRText - labelLine: Polyline - computedLayoutOption: LabelLayoutOption + labelLine?: Polyline + computedLayoutOption?: LabelLayoutOption priority: number defaultAttr: { ignore: boolean - labelGuideIgnore: boolean + labelGuideIgnore?: boolean } } @@ -44,7 +44,7 @@ export interface LabelLayoutInfo { layoutOption: LabelLayoutOption defaultAttr: { ignore: boolean - labelGuideIgnore: boolean + labelGuideIgnore?: boolean } transform: number[] } From ec9b3fc3ea5e69315e2a1c3e009f9991e10f3c4a Mon Sep 17 00:00:00 2001 From: Savas Vedova <svedova@gitlab.com> Date: Tue, 24 Aug 2021 16:22:27 +0300 Subject: [PATCH 2/5] Use tick level to determine the priority --- src/component/axis/AxisBuilder.ts | 20 ++++++++++++-------- src/coord/axisTickLabelBuilder.ts | 2 ++ src/util/types.ts | 1 + 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/component/axis/AxisBuilder.ts b/src/component/axis/AxisBuilder.ts index eb7c2ca973..b9b8ed7e2f 100644 --- a/src/component/axis/AxisBuilder.ts +++ b/src/component/axis/AxisBuilder.ts @@ -349,15 +349,17 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection); - const labelList = prepareLayoutList(labelEls.map(label => ({ - label, - priority: label.style.text?.includes('primary') ? 1 : 0, - defaultAttr: { - ignore: label.ignore - } - }))); + if (axisModel.type === 'xAxis.time') { + const labelList = prepareLayoutList(labelEls.map(label => ({ + label, + priority: label.zlevel, + defaultAttr: { + ignore: label.ignore + } + }))); - hideOverlap(labelList); + hideOverlap(labelList); + } }, axisName(opt, axisModel, group, transformGroup) { @@ -820,6 +822,8 @@ function buildAxisLabel( transformGroup.add(textEl); textEl.updateTransform(); + textEl.zlevel = labelItem.level; + labelEls.push(textEl); group.add(textEl); diff --git a/src/coord/axisTickLabelBuilder.ts b/src/coord/axisTickLabelBuilder.ts index 332e542e83..fbc2e5c975 100644 --- a/src/coord/axisTickLabelBuilder.ts +++ b/src/coord/axisTickLabelBuilder.ts @@ -62,6 +62,7 @@ const inner = makeInner<InnerStore, any>(); export function createAxisLabels(axis: Axis): { labels: { + level?: number, formattedLabel: string, rawLabel: string, tickValue: number @@ -176,6 +177,7 @@ function makeRealNumberLabels(axis: Axis) { return { labels: zrUtil.map(ticks, function (tick, idx) { return { + level: tick.level, formattedLabel: labelFormatter(tick, idx), rawLabel: axis.scale.getLabel(tick), tickValue: tick.value diff --git a/src/util/types.ts b/src/util/types.ts index ab1a6b1b2b..1686e56d45 100644 --- a/src/util/types.ts +++ b/src/util/types.ts @@ -377,6 +377,7 @@ export type ParsedValueNumeric = number | OrdinalNumber; export type ScaleDataValue = ParsedValueNumeric | OrdinalRawValue | Date; export interface ScaleTick { + level?: number, value: number }; export interface TimeScaleTick extends ScaleTick { From 7d33cfb062d7035c5c3bce61bcb5a269d0762daf Mon Sep 17 00:00:00 2001 From: Savas Vedova <svedova@gitlab.com> Date: Tue, 24 Aug 2021 16:24:59 +0300 Subject: [PATCH 3/5] Add comment to describe the fix --- src/component/axis/AxisBuilder.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/component/axis/AxisBuilder.ts b/src/component/axis/AxisBuilder.ts index b9b8ed7e2f..4d2b4977eb 100644 --- a/src/component/axis/AxisBuilder.ts +++ b/src/component/axis/AxisBuilder.ts @@ -349,6 +349,8 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu buildAxisMinorTicks(group, transformGroup, axisModel, opt.tickDirection); + // This bit fixes the label overlap issue for the Time chart. + // See https://github.com/apache/echarts/issues/14266 for more. if (axisModel.type === 'xAxis.time') { const labelList = prepareLayoutList(labelEls.map(label => ({ label, From 319ac07d0604b4914809cb27ec142baf0de033e1 Mon Sep 17 00:00:00 2001 From: Savas Vedova <svedova@gitlab.com> Date: Wed, 25 Aug 2021 20:55:25 +0300 Subject: [PATCH 4/5] Use z2 instead of zlevel for priority --- src/component/axis/AxisBuilder.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/component/axis/AxisBuilder.ts b/src/component/axis/AxisBuilder.ts index 4d2b4977eb..31d6a9c8bb 100644 --- a/src/component/axis/AxisBuilder.ts +++ b/src/component/axis/AxisBuilder.ts @@ -351,10 +351,10 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu // This bit fixes the label overlap issue for the Time chart. // See https://github.com/apache/echarts/issues/14266 for more. - if (axisModel.type === 'xAxis.time') { + if (axisModel.get('type') === 'time') { const labelList = prepareLayoutList(labelEls.map(label => ({ label, - priority: label.zlevel, + priority: label.z2, defaultAttr: { ignore: label.ignore } @@ -781,7 +781,7 @@ function buildAxisLabel( y: opt.labelOffset + opt.labelDirection * labelMargin, rotation: labelLayout.rotation, silent: silent, - z2: 10, + z2: labelItem.level, style: createTextStyle(itemLabelModel, { text: formattedLabel, align: itemLabelModel.getShallow('align', true) @@ -824,8 +824,6 @@ function buildAxisLabel( transformGroup.add(textEl); textEl.updateTransform(); - textEl.zlevel = labelItem.level; - labelEls.push(textEl); group.add(textEl); From 563fc01a1aec3a9859943e7bc11ecddc3a457fcf Mon Sep 17 00:00:00 2001 From: Savas Vedova <svedova@gitlab.com> Date: Thu, 26 Aug 2021 12:48:42 +0300 Subject: [PATCH 5/5] Use map and have a fallback z2 value --- src/component/axis/AxisBuilder.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/component/axis/AxisBuilder.ts b/src/component/axis/AxisBuilder.ts index 31d6a9c8bb..6fad867a6a 100644 --- a/src/component/axis/AxisBuilder.ts +++ b/src/component/axis/AxisBuilder.ts @@ -17,7 +17,7 @@ * under the License. */ -import {retrieve, defaults, extend, each, isObject} from 'zrender/src/core/util'; +import {retrieve, defaults, extend, each, isObject, map} from 'zrender/src/core/util'; import * as graphic from '../../util/graphic'; import {getECData} from '../../util/innerStore'; import {createTextStyle} from '../../label/labelStyle'; @@ -352,7 +352,7 @@ const builders: Record<'axisLine' | 'axisTickLabel' | 'axisName', AxisElementsBu // This bit fixes the label overlap issue for the Time chart. // See https://github.com/apache/echarts/issues/14266 for more. if (axisModel.get('type') === 'time') { - const labelList = prepareLayoutList(labelEls.map(label => ({ + const labelList = prepareLayoutList(map(labelEls, label => ({ label, priority: label.z2, defaultAttr: { @@ -781,7 +781,7 @@ function buildAxisLabel( y: opt.labelOffset + opt.labelDirection * labelMargin, rotation: labelLayout.rotation, silent: silent, - z2: labelItem.level, + z2: 10 + (labelItem.level || 0), style: createTextStyle(itemLabelModel, { text: formattedLabel, align: itemLabelModel.getShallow('align', true)