From 75b7965a15dd3759ad6d6a7c50b86fccc5f425f0 Mon Sep 17 00:00:00 2001 From: hustcc Date: Tue, 15 Aug 2023 16:59:43 +0800 Subject: [PATCH] fix: axis arrow direction (#5359) --- .../static/alphabetIntervalAxisArrow.png | Bin 0 -> 12229 bytes .../alphabetIntervalAxisArrowPosition.png | Bin 0 -> 11720 bytes .../alphabetIntervalAxisArrowTransposed.png | Bin 0 -> 13267 bytes .../alphabet-interval-axis-arrow-position.ts | 21 ++++++++++++++++++ ...alphabet-interval-axis-arrow-transposed.ts | 21 ++++++++++++++++++ .../static/alphabet-interval-axis-arrow.ts | 20 +++++++++++++++++ __tests__/plots/static/index.ts | 3 +++ src/component/axis.ts | 15 ++++++++----- src/theme/academy.ts | 12 +++++----- src/theme/classic.ts | 13 +++++------ src/theme/classicDark.ts | 12 +++++----- src/utils/scale.ts | 2 +- 12 files changed, 94 insertions(+), 25 deletions(-) create mode 100644 __tests__/integration/snapshots/static/alphabetIntervalAxisArrow.png create mode 100644 __tests__/integration/snapshots/static/alphabetIntervalAxisArrowPosition.png create mode 100644 __tests__/integration/snapshots/static/alphabetIntervalAxisArrowTransposed.png create mode 100644 __tests__/plots/static/alphabet-interval-axis-arrow-position.ts create mode 100644 __tests__/plots/static/alphabet-interval-axis-arrow-transposed.ts create mode 100644 __tests__/plots/static/alphabet-interval-axis-arrow.ts diff --git a/__tests__/integration/snapshots/static/alphabetIntervalAxisArrow.png b/__tests__/integration/snapshots/static/alphabetIntervalAxisArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..82e3d57e0e65dbd623971636bd505ddd45dfeab1 GIT binary patch literal 12229 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 literal 0 HcmV?d00001 diff --git a/__tests__/plots/static/alphabet-interval-axis-arrow-position.ts b/__tests__/plots/static/alphabet-interval-axis-arrow-position.ts new file mode 100644 index 0000000000..725dbb6c07 --- /dev/null +++ b/__tests__/plots/static/alphabet-interval-axis-arrow-position.ts @@ -0,0 +1,21 @@ +import { G2Spec } from '../../../src'; + +export function alphabetIntervalAxisArrowPosition(): G2Spec { + return { + type: 'interval', + transform: [{ type: 'sortX', by: 'y', reverse: true }], + data: { + type: 'fetch', + value: 'data/alphabet.csv', + }, + axis: { + x: { line: true, arrow: true, position: 'top' }, + y: { labelFormatter: '.0%', line: true, arrow: true, position: 'right' }, + }, + encode: { + x: 'letter', + y: 'frequency', + color: 'steelblue', + }, + }; +} diff --git a/__tests__/plots/static/alphabet-interval-axis-arrow-transposed.ts b/__tests__/plots/static/alphabet-interval-axis-arrow-transposed.ts new file mode 100644 index 0000000000..34cd869abc --- /dev/null +++ b/__tests__/plots/static/alphabet-interval-axis-arrow-transposed.ts @@ -0,0 +1,21 @@ +import { G2Spec } from '../../../src'; + +export function alphabetIntervalAxisArrowTransposed(): G2Spec { + return { + type: 'interval', + coordinate: { transform: [{ type: 'transpose' }] }, + data: { + type: 'fetch', + value: 'data/alphabet.csv', + }, + axis: { + x: { line: true, arrow: true }, + y: { labelFormatter: '.0%', line: true, arrow: true }, + }, + encode: { + x: 'letter', + y: 'frequency', + color: 'steelblue', + }, + }; +} diff --git a/__tests__/plots/static/alphabet-interval-axis-arrow.ts b/__tests__/plots/static/alphabet-interval-axis-arrow.ts new file mode 100644 index 0000000000..f1bcdf48b0 --- /dev/null +++ b/__tests__/plots/static/alphabet-interval-axis-arrow.ts @@ -0,0 +1,20 @@ +import { G2Spec } from '../../../src'; + +export function alphabetIntervalAxisArrow(): G2Spec { + return { + type: 'interval', + data: { + type: 'fetch', + value: 'data/alphabet.csv', + }, + axis: { + x: { line: true, arrow: true }, + y: { labelFormatter: '.0%', line: true, arrow: true }, + }, + encode: { + x: 'letter', + y: 'frequency', + color: 'steelblue', + }, + }; +} diff --git a/__tests__/plots/static/index.ts b/__tests__/plots/static/index.ts index 4f782989a5..3bff3a073b 100644 --- a/__tests__/plots/static/index.ts +++ b/__tests__/plots/static/index.ts @@ -248,6 +248,9 @@ export { mockAxisY } from './mock-axisY'; export { mockAxisXY } from './mock-axisXY'; export { mockAxisXYPolar } from './mock-axisXY-polar'; export { alphabetIntervalAxis } from './alphabet-interval-axis'; +export { alphabetIntervalAxisArrow } from './alphabet-interval-axis-arrow'; +export { alphabetIntervalAxisArrowTransposed } from './alphabet-interval-axis-arrow-transposed'; +export { alphabetIntervalAxisArrowPosition } from './alphabet-interval-axis-arrow-position'; export { commitsPointGroupedLegendFlexCenter } from './commits-point-grouped-legend-flex-center'; export { commitsPointGroupedLegendFlexRight } from './commits-point-grouped-legend-flex-right'; export { commitsPointGroupedLegendPositionRight } from './commits-point-grouped-legend-position-right'; diff --git a/src/component/axis.ts b/src/component/axis.ts index 4eca8099ed..72f343b6f2 100644 --- a/src/component/axis.ts +++ b/src/component/axis.ts @@ -2,7 +2,7 @@ import { Coordinate } from '@antv/coord'; import type { DisplayObject } from '@antv/g'; import { Axis as AxisComponent } from '@antv/gui'; import { Linear as LinearScale } from '@antv/scale'; -import { deepMix, has, omit } from '@antv/util'; +import { deepMix, omit } from '@antv/util'; import { extent } from 'd3-array'; import { format } from 'd3-format'; import { @@ -24,6 +24,7 @@ import { radiusOf, } from '../utils/coordinate'; import { capitalizeFirst } from '../utils/helper'; +import { isOrdinalScale } from '../utils/scale'; import { adaptor, isVertical, titleContent } from './utils'; export type AxisOptions = { @@ -157,6 +158,7 @@ function getData( const applyFisheye = createFisheye(position, coordinate); const isHorizontal = (position) => ['top', 'bottom', 'center', 'outer'].includes(position); + const isVertical = (position) => ['left', 'right'].includes(position); // @todo GUI should consider the overlap problem for the first // and label of arc axis. @@ -168,7 +170,9 @@ function getData( (isRadial(coordinate) && position === 'center') || (isTranspose(coordinate) && scale.getTicks?.() && - isHorizontal(position)); + isHorizontal(position)) || + (isTranspose(coordinate) && isVertical(position)); + return { value: shouldReverse ? 1 - tick : tick, label: toString(labelFormatter(prettyNumber(d), i, array)), @@ -180,8 +184,9 @@ function getData( return filteredTicks.map((d, i, array) => { const offset = scale.getBandWidth?.(d) / 2 || 0; const tick = applyFisheye(applyInset(scale.map(d) + offset)); + const shouldReverse = isVertical(position); return { - value: tick, + value: shouldReverse ? 1 - tick : tick, label: toString(labelFormatter(prettyNumber(d), i, array)), id: String(i), }; @@ -291,10 +296,10 @@ function inferAxisLinearOverrideStyle( return { startPos: [x, y], endPos: [x + width, y] }; } if (position === 'left') { - return { startPos: [x + width, y], endPos: [x + width, y + height] }; + return { startPos: [x + width, y + height], endPos: [x + width, y] }; } if (position === 'right') { - return { endPos: [x, y + height], startPos: [x, y] }; + return { startPos: [x, y + height], endPos: [x, y] }; } if (position === 'top') { return { startPos: [x, y + height], endPos: [x + width, y + height] }; diff --git a/src/theme/academy.ts b/src/theme/academy.ts index 93b2295e3a..71d702c4fa 100644 --- a/src/theme/academy.ts +++ b/src/theme/academy.ts @@ -245,10 +245,10 @@ export const Academy: TC = (options) => { titleTextBaseline: 'bottom', }, axisLeft: { - gridDirection: 'negative', - labelDirection: 'positive', + gridDirection: 'positive', + labelDirection: 'negative', labelSpacing: 4, - tickDirection: 'positive', + tickDirection: 'negative', titlePosition: 'left', titleSpacing: 4, titleTextBaseline: 'middle', @@ -256,10 +256,10 @@ export const Academy: TC = (options) => { titleTransformOrigin: 'center', }, axisRight: { - gridDirection: 'positive', - labelDirection: 'negative', + gridDirection: 'negative', + labelDirection: 'positive', labelSpacing: 4, - tickDirection: 'negative', + tickDirection: 'positive', titlePosition: 'right', titleSpacing: 0, titleTextBaseline: 'top', diff --git a/src/theme/classic.ts b/src/theme/classic.ts index 51785f2e29..38cbfc497f 100644 --- a/src/theme/classic.ts +++ b/src/theme/classic.ts @@ -245,11 +245,11 @@ export const Classic: TC = (options) => { titleTextBaseline: 'bottom', }, axisLeft: { - gridDirection: 'negative', + gridDirection: 'positive', labelAutoRotate: false, - labelDirection: 'positive', + labelDirection: 'negative', labelSpacing: 4, - tickDirection: 'positive', + tickDirection: 'negative', titlePosition: 'left', titleSpacing: 10, titleTextBaseline: 'middle', @@ -257,11 +257,10 @@ export const Classic: TC = (options) => { titleTransformOrigin: 'center', }, axisRight: { - gridDirection: 'positive', - labelDirection: 'negative', + gridDirection: 'negative', + labelDirection: 'positive', labelSpacing: 4, - labelAutoRotate: false, - tickDirection: 'negative', + tickDirection: 'positive', titlePosition: 'right', titleSpacing: 0, titleTextBaseline: 'top', diff --git a/src/theme/classicDark.ts b/src/theme/classicDark.ts index edc38262cc..679e1bd939 100644 --- a/src/theme/classicDark.ts +++ b/src/theme/classicDark.ts @@ -244,11 +244,11 @@ export const ClassicDark: TC = (options) => { titleTextBaseline: 'bottom', }, axisLeft: { - gridDirection: 'negative', + gridDirection: 'positive', labelAutoRotate: false, - labelDirection: 'positive', + labelDirection: 'negative', labelSpacing: 4, - tickDirection: 'positive', + tickDirection: 'negative', titlePosition: 'left', titleSpacing: 10, titleTextBaseline: 'middle', @@ -256,10 +256,10 @@ export const ClassicDark: TC = (options) => { titleTransformOrigin: 'center', }, axisRight: { - gridDirection: 'positive', - labelDirection: 'negative', + gridDirection: 'negative', + labelDirection: 'positive', labelSpacing: 4, - tickDirection: 'negative', + tickDirection: 'positive', titlePosition: 'right', titleSpacing: 0, titleTextBaseline: 'top', diff --git a/src/utils/scale.ts b/src/utils/scale.ts index ef0fa34bc8..2e0177edc8 100644 --- a/src/utils/scale.ts +++ b/src/utils/scale.ts @@ -5,7 +5,7 @@ function constrain(x, lo, hi) { } export function isOrdinalScale(scale) { - return scale.getBandWidth; + return !!scale.getBandWidth; } export function invert(scale, x, start) {