From 14830ab5e73fd0ad698df71a3617eed3704a4c7a Mon Sep 17 00:00:00 2001 From: hustcc Date: Tue, 30 May 2023 14:20:21 +0800 Subject: [PATCH 1/3] feat(interval): add minWidth maxWidth options for interval shape --- .../alphabet-interval-max-width-transposed.ts | 33 +++++++++++++++++ .../static/alphabet-interval-max-width.ts | 32 +++++++++++++++++ .../alphabet-interval-min-width-transposed.ts | 26 ++++++++++++++ .../static/alphabet-interval-min-width.ts | 25 +++++++++++++ __tests__/plots/static/index.ts | 4 +++ __tests__/unit/utils/number.spec.ts | 9 +++++ src/shape/interval/color.ts | 35 ++++++++++++++++--- src/shape/interval/rect.ts | 11 +++++- src/utils/number.ts | 6 ++++ 9 files changed, 175 insertions(+), 6 deletions(-) create mode 100644 __tests__/plots/static/alphabet-interval-max-width-transposed.ts create mode 100644 __tests__/plots/static/alphabet-interval-max-width.ts create mode 100644 __tests__/plots/static/alphabet-interval-min-width-transposed.ts create mode 100644 __tests__/plots/static/alphabet-interval-min-width.ts create mode 100644 __tests__/unit/utils/number.spec.ts create mode 100644 src/utils/number.ts diff --git a/__tests__/plots/static/alphabet-interval-max-width-transposed.ts b/__tests__/plots/static/alphabet-interval-max-width-transposed.ts new file mode 100644 index 0000000000..c83c1e5253 --- /dev/null +++ b/__tests__/plots/static/alphabet-interval-max-width-transposed.ts @@ -0,0 +1,33 @@ +import { G2Spec } from '../../../src'; + +export function alphabetIntervalMaxWidthTransposed(): G2Spec { + return { + type: 'interval', + coordinate: { transform: [{ type: 'transpose' }] }, + data: { + type: 'fetch', + value: 'data/alphabet.csv', + transform: [ + { + type: 'slice', + start: 0, + end: 3, + }, + ], + }, + encode: { + x: 'letter', + y: 'frequency', + color: 'steelblue', + }, + scale: { + x: { padding: 0.1 }, + }, + style: { + maxWidth: 10, + }, + axis: { + y: { labelFormatter: '.0%' }, + }, + }; +} diff --git a/__tests__/plots/static/alphabet-interval-max-width.ts b/__tests__/plots/static/alphabet-interval-max-width.ts new file mode 100644 index 0000000000..ef1a8ed5e7 --- /dev/null +++ b/__tests__/plots/static/alphabet-interval-max-width.ts @@ -0,0 +1,32 @@ +import { G2Spec } from '../../../src'; + +export function alphabetIntervalMaxWidth(): G2Spec { + return { + type: 'interval', + data: { + type: 'fetch', + value: 'data/alphabet.csv', + transform: [ + { + type: 'slice', + start: 0, + end: 3, + }, + ], + }, + encode: { + x: 'letter', + y: 'frequency', + color: 'steelblue', + }, + scale: { + x: { padding: 0.1 }, + }, + style: { + maxWidth: 10, + }, + axis: { + y: { labelFormatter: '.0%' }, + }, + }; +} diff --git a/__tests__/plots/static/alphabet-interval-min-width-transposed.ts b/__tests__/plots/static/alphabet-interval-min-width-transposed.ts new file mode 100644 index 0000000000..10e1d7f563 --- /dev/null +++ b/__tests__/plots/static/alphabet-interval-min-width-transposed.ts @@ -0,0 +1,26 @@ +import { G2Spec } from '../../../src'; + +export function alphabetIntervalMinWidthTransposed(): G2Spec { + return { + type: 'interval', + coordinate: { transform: [{ type: 'transpose' }] }, + data: { + type: 'fetch', + value: 'data/alphabet.csv', + }, + encode: { + x: 'letter', + y: 'frequency', + color: 'steelblue', + }, + scale: { + x: { padding: 0.9 }, + }, + style: { + minWidth: 10, + }, + axis: { + y: { labelFormatter: '.0%' }, + }, + }; +} diff --git a/__tests__/plots/static/alphabet-interval-min-width.ts b/__tests__/plots/static/alphabet-interval-min-width.ts new file mode 100644 index 0000000000..8483521e9f --- /dev/null +++ b/__tests__/plots/static/alphabet-interval-min-width.ts @@ -0,0 +1,25 @@ +import { G2Spec } from '../../../src'; + +export function alphabetIntervalMinWidth(): G2Spec { + return { + type: 'interval', + data: { + type: 'fetch', + value: 'data/alphabet.csv', + }, + encode: { + x: 'letter', + y: 'frequency', + color: 'steelblue', + }, + scale: { + x: { padding: 0.9 }, + }, + style: { + minWidth: 16, + }, + axis: { + y: { labelFormatter: '.0%' }, + }, + }; +} diff --git a/__tests__/plots/static/index.ts b/__tests__/plots/static/index.ts index bb18841096..140b2923a7 100644 --- a/__tests__/plots/static/index.ts +++ b/__tests__/plots/static/index.ts @@ -1,4 +1,8 @@ export { alphabetInterval } from './alphabet-interval'; +export { alphabetIntervalMaxWidth } from './alphabet-interval-max-width'; +export { alphabetIntervalMinWidth } from './alphabet-interval-min-width'; +export { alphabetIntervalMaxWidthTransposed } from './alphabet-interval-max-width-transposed'; +export { alphabetIntervalMinWidthTransposed } from './alphabet-interval-min-width-transposed'; export { alphabetIntervalTitle } from './alphabet-interval-title'; export { alphabetIntervalLabelOverflowHide } from './alphabet-interval-label-overflow-hide'; export { alphabetIntervalLabelContrastReverse } from './alphabet-interval-label-contrast-reverse'; diff --git a/__tests__/unit/utils/number.spec.ts b/__tests__/unit/utils/number.spec.ts new file mode 100644 index 0000000000..6f57bfa635 --- /dev/null +++ b/__tests__/unit/utils/number.spec.ts @@ -0,0 +1,9 @@ +import { clamp } from '../../../src/utils/number'; + +describe('number', () => { + it('clame should return value between lower and upper', () => { + expect(clamp(1, 0, 2)).toBe(1); + expect(clamp(1, 2, 3)).toBe(2); + expect(clamp(5, 2, 3)).toBe(3); + }); +}); diff --git a/src/shape/interval/color.ts b/src/shape/interval/color.ts index bb948fc9b5..1309f62eb9 100644 --- a/src/shape/interval/color.ts +++ b/src/shape/interval/color.ts @@ -3,7 +3,8 @@ import { arc } from 'd3-shape'; import { Vector2, ShapeComponent as SC } from '../../runtime'; import { isPolar, isHelix, isTranspose } from '../../utils/coordinate'; import { select } from '../../utils/selection'; -import { sub } from '../.././utils/vector'; +import { sub } from '../../utils/vector'; +import { clamp } from '../../utils/number'; import { applyStyle, getArcObject, @@ -14,6 +15,14 @@ import { export type ColorOptions = { colorAttribute: 'fill' | 'stroke'; + /** + * Minimum width of each interval. + */ + minWidth?: number; + /** + * Maximum width of each interval. + */ + maxWidth?: number; [key: string]: any; }; @@ -24,6 +33,7 @@ export function rect( coordinate, style: Record = {}, ) { + console.log(1111, points, value, coordinate, style); const { inset = 0, radius = 0, @@ -35,6 +45,8 @@ export function rect( radiusBottomRight = radius, radiusTopLeft = radius, radiusTopRight = radius, + minWidth = -Infinity, + maxWidth = Infinity, ...rest } = style; if (!isPolar(coordinate) && !isHelix(coordinate)) { @@ -53,11 +65,20 @@ export function rect( const finalWidth = absWidth - (insetLeft + insetRight); const finalHeight = absHeight - (insetTop + insetBottom); + const clampWidth = tpShape + ? finalWidth + : clamp(finalWidth, minWidth, maxWidth); + const clampHeight = tpShape + ? clamp(finalHeight, minWidth, maxWidth) + : finalHeight; + const clampX = finalX - (clampWidth - finalWidth) / 2; + const clampY = finalY - (clampHeight - finalHeight) / 2; + return select(new Rect({})) - .style('x', finalX) - .style('y', finalY) - .style('width', finalWidth) - .style('height', finalHeight) + .style('x', clampX) + .style('y', clampY) + .style('width', clampWidth) + .style('height', clampHeight) .style('radius', [ radiusTopLeft, radiusTopRight, @@ -128,6 +149,8 @@ export const Color: SC = (options) => { insetRight = inset, insetBottom = inset, insetTop = inset, + minWidth, + maxWidth, ...rest } = style; const { color = defaultColor, opacity } = value; @@ -160,6 +183,8 @@ export const Color: SC = (options) => { insetRight, insetBottom, insetTop, + minWidth, + maxWidth, }; return ( diff --git a/src/shape/interval/rect.ts b/src/shape/interval/rect.ts index ff6cef8847..9f020a10f5 100644 --- a/src/shape/interval/rect.ts +++ b/src/shape/interval/rect.ts @@ -1,7 +1,16 @@ import { ShapeComponent as SC } from '../../runtime'; import { Color } from './color'; -export type RectOptions = Record; +export type RectOptions = { + /** + * Minimum width of each interval. + */ + minWidth?: number; + /** + * Maximum width of each interval. + */ + maxWidth?: number; +}; /** * Render rect in different coordinate and using color channel for stroke and fill attribute. diff --git a/src/utils/number.ts b/src/utils/number.ts new file mode 100644 index 0000000000..786d2f57c9 --- /dev/null +++ b/src/utils/number.ts @@ -0,0 +1,6 @@ +/** + * Clamp number within the inclusive range within the lower and upper bounds. + */ +export function clamp(v: number, lower: number, upper: number): number { + return Math.max(lower, Math.min(v, upper)); +} From 7e6fb7ec4c8259a880e1474d7850acc445ca77ad Mon Sep 17 00:00:00 2001 From: hustcc Date: Tue, 30 May 2023 14:33:02 +0800 Subject: [PATCH 2/3] docs: add docs and demo --- site/docs/spec/mark/interval.zh.md | 2 ++ .../general/interval/demo/column-maxwidth.ts | 18 ++++++++++++++++++ site/examples/general/interval/demo/meta.json | 10 +++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 site/examples/general/interval/demo/column-maxwidth.ts diff --git a/site/docs/spec/mark/interval.zh.md b/site/docs/spec/mark/interval.zh.md index f2f86976bd..1332accb36 100644 --- a/site/docs/spec/mark/interval.zh.md +++ b/site/docs/spec/mark/interval.zh.md @@ -62,6 +62,8 @@ chart.render(); | 属性 | 描述 | 类型 | 默认值 | | ---------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | --------- | +| minWidth | 柱子的最小宽度,单位为像素 | `number` | `-Infinity` | +| maxWidth | 柱子的最大宽度,单位为像素 | `number` | `Infinity` | | radius | 外层矩形的四个圆角大小 | `number` \| `Function` | 0 | | radiusTopLeft | 外层左上角的圆角 | `number` \| `Function` | 0 | | radiusTopRight | 外层右上角的圆角 | `number` \| `Function` | 0 | diff --git a/site/examples/general/interval/demo/column-maxwidth.ts b/site/examples/general/interval/demo/column-maxwidth.ts new file mode 100644 index 0000000000..2dc224df6f --- /dev/null +++ b/site/examples/general/interval/demo/column-maxwidth.ts @@ -0,0 +1,18 @@ +import { Chart } from '@antv/g2'; + +const chart = new Chart({ + container: 'container', + theme: 'classic', + autoFit: true, +}); + +chart + .interval() + .data([{ letter: 'A', frequency: 120 }]) + .encode('x', 'letter') + .encode('y', 'frequency') + .scale('x', { padding: 0.5 }) + // .style('minWidth', 500) + .style('maxWidth', 200); + +chart.render(); diff --git a/site/examples/general/interval/demo/meta.json b/site/examples/general/interval/demo/meta.json index 4c7a2a7f45..e0e20992bc 100644 --- a/site/examples/general/interval/demo/meta.json +++ b/site/examples/general/interval/demo/meta.json @@ -7,11 +7,19 @@ { "filename": "column.ts", "title": { - "zh": "条形图", + "zh": "柱形图", "en": "Column Chart" }, "screenshot": "https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*vhCKQJ9UJX4AAAAAAAAAAAAADmJ7AQ/original" }, + { + "filename": "column-maxwidth.ts", + "title": { + "zh": "限制宽度的条形图", + "en": "Column with maxWidth" + }, + "screenshot": "https://mdn.alipayobjects.com/huamei_qa8qxu/afts/img/A*fu-BSYg7U_kAAAAAAAAAAAAADmJ7AQ/original" + }, { "filename": "bar.ts", "title": { From a1b3dbf754be4dfc98575c46fda86dabe2f4aba9 Mon Sep 17 00:00:00 2001 From: hustcc Date: Tue, 30 May 2023 14:48:18 +0800 Subject: [PATCH 3/3] test: add test case screenshots --- .../static/alphabetIntervalMaxWidth.png | Bin 0 -> 6224 bytes .../alphabetIntervalMaxWidthTransposed.png | Bin 0 -> 6055 bytes .../static/alphabetIntervalMinWidth.png | Bin 0 -> 11121 bytes .../alphabetIntervalMinWidthTransposed.png | Bin 0 -> 12527 bytes site/examples/general/interval/demo/meta.json | 2 +- src/shape/interval/color.ts | 1 - 6 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 __tests__/integration/snapshots/static/alphabetIntervalMaxWidth.png create mode 100644 __tests__/integration/snapshots/static/alphabetIntervalMaxWidthTransposed.png create mode 100644 __tests__/integration/snapshots/static/alphabetIntervalMinWidth.png create mode 100644 __tests__/integration/snapshots/static/alphabetIntervalMinWidthTransposed.png diff --git a/__tests__/integration/snapshots/static/alphabetIntervalMaxWidth.png b/__tests__/integration/snapshots/static/alphabetIntervalMaxWidth.png new file mode 100644 index 0000000000000000000000000000000000000000..870f80599723b492f1ad20a875cce0a64a1ea86a GIT binary patch literal 6224 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 btu5>N9$>o5<^;V%3m~uF)GoVX|L{KmX6YD| literal 0 HcmV?d00001 diff --git a/__tests__/integration/snapshots/static/alphabetIntervalMinWidthTransposed.png b/__tests__/integration/snapshots/static/alphabetIntervalMinWidthTransposed.png new file mode 100644 index 0000000000000000000000000000000000000000..8250375539c658081421b164530aa2550ce2086d GIT binary patch literal 12527 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 = {}, ) { - console.log(1111, points, value, coordinate, style); const { inset = 0, radius = 0,